从1999年版开始,ISO C标准定义了一个标准头<stdint.h>
除其他外,它定义了 typedefintmax_t
and uintmax_t
。它们分别指定“能够表示任何(有符号|无符号)整数类型的任何值的(有符号|无符号)整数类型”。
例如,如果按照典型情况,最宽的有符号和无符号整数类型是long long int
and unsigned long long int
,两者通常都是 64 位,那么intmax_t
and uintmax_t
可能定义在<stdint.h>
如下:
typedef long long int intmax_t;
typedef unsigned long long int uintmax_t;
有一组有限的预定义有符号和无符号整数类型,范围从signed
, unsigned
,和普通的char
up to signed
and unsigned
long long int
.
C99 和 C11 还允许实现定义扩展整数类型,它们与任何标准类型都不同,并且具有实现定义的关键字名称。
gcc 和 clang 在某些但不是所有目标上都支持类型__int128
and unsigned __int128
。它们的行为类似于 128 位整数类型,但它们是not像...一样对待扩展整数类型,并且两个编译器的文档均声明它们不支持任何扩展整数类型。因为这些不是整数类型正如标准定义的术语,typedefsintmax_t
and uintmax_t
适用于 64 位类型,不适用于 128 位类型。
这些都没有违反 C 标准(实现不需要具有任何扩展整数类型,并且允许它们具有任意扩展,只要它们不破坏任何严格遵守的程序)。但在我看来,这对于__int128
and unsigned __int128
被视为扩展整数类型,并且对于intmax_t
and uintmax_t
为 128 位类型。
理由not这样做的目的是改变intmax_t
and uintmax_t
将是“与 ABI 不兼容的更改”。
The Clang C++ 状态页面 http://clang.llvm.org/cxx_status.html在脚注(5)中说:
对于不提供任何扩展整数类型的实现(例如 Clang),不需要更改编译器。__int128
不被视为扩展整数类型,因为改变intmax_t
将是与 ABI 不兼容的更改。
(是的,这主要讨论 C++,但规则与 C 相同。)
In a 海湾合作委员会错误报告 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49595,提出如下主张:
sizeof(intmax_t)
由各种 LP64 ABI 固定且无法更改
在这两种情况下,都没有给出该主张的参考资料。
An x86_64 ABI 文档 http://www.x86-64.org/documentation/abi.pdf标题为“System V 应用程序二进制接口,AMD64 架构处理器补充,草案版本 0.99.6”并没有提及intmax_t
or uintmax_t
,甚至是<stdint.h>
标头。它确实指定了预定义整数类型的大小和对齐方式(如图 3.1 所示)。
最后,我的问题是:是否声称尺寸intmax_t
and uintmax_t
受 ABI 限制有效吗?如果是这样,什么 ABI 提出了这样的要求? (顺便问一下,为什么?)
(在我看来,这样的要求,如果存在的话,是不明智的。它违背了 C 标准允许定义扩展整数类型的目的,以及intmax_t
and uintmax_t
。这使得在支持 128 位整数类型的系统上有效使用 128 位整数类型变得更加困难,同时在其他系统上回退到更窄的类型。)
Update:在题为“intmax t,一条出路”的 N2303 中,Jens Gustedt 建议调整以下定义:[u]intmax_t
允许添加扩展整数类型宽于long long
无需更新[u]intmax_t
。例如,intmax_t
可能是一个 typedeflong long
,但实施仍然可以提供,比如说,__int128
as an 扩展整数类型.
参考:
-
N1256 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf,C99标准草案
-
N1570 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf,C11标准草案
-
N2303 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2303.pdf,Jens Gustedt 的提案
- 系统 V AMD64 ABI http://www.x86-64.org/documentation/abi.pdf