有许多编译器提供128位整数类型,但我使用的所有编译器都没有提供int128_t
这个typedef。为什么呢?
据我所知,标准:
- 保留了
int128_t
作为此目的的保留名称 - 鼓励实现提供此类类型并提供typedef
- 强制要求此类实现至少提供一个128位的
intmax_t
(而且,我不相信我使用过符合最后一点规定的实现)
有许多编译器提供128位整数类型,但我使用的所有编译器都没有提供int128_t
这个typedef。为什么呢?
据我所知,标准:
int128_t
作为此目的的保留名称intmax_t
(而且,我不相信我使用过符合最后一点规定的实现)
我将参考C标准;我认为C++标准从C继承了关于<stdint.h>
/ <cstdint>
的规则。
我知道gcc实现了128位有符号和无符号整数,名称为__int128
和unsigned __int128
(__int128
是一个实现定义的关键字)在某些平台上。
即使对于提供标准128位类型的实现,标准也不要求定义int128_t
或uint128_t
。引用C标准草案N1570的第7.20.1.1节:
这些类型是可选的。然而,如果一个实现提供了宽度为8、16、32或64位、没有填充位,并且(对于有符号类型)具有二进制补码表示的整数类型,则应该定义相应的typedef名字。
C允许实现定义其名称为实现定义关键字的扩展整数类型。gcc的__int128
和unsigned __int128
与标准定义的扩展整数类型非常相似,但gcc不会将它们视为这种类型。相反,它将它们视为一种语言扩展。
特别地,如果__int128
和unsigned __int128
是扩展整数类型,那么gcc将需要将intmax_t
和uintmax_t
定义为这些类型(或至少为128位宽的某些类型)。但它并没有这样做;相反,intmax_t
和uintmax_t
仅为64位。
在我看来,这是不幸的,但我不认为它使gcc不符合规范。没有可移植程序可以依赖于__int128
的存在,也不能依赖于任何比64位更宽的整数类型。而且改变intmax_t
和uintmax_t
将导致严重的ABI兼容性问题。
__int128
出现在子条款 J.5.6
(其他算术类型)中,因此它可能被视为编译器的扩展。这与 GCC 的文档 是一致的,即:GCC 不支持任何扩展整数类型。
- Grzegorz Szpetkowskiintmax_t
,那么任何使用该类型并在类型扩展后编译的代码将无法与在类型扩展之前编译的代码链接。在许多情况下,能够使新代码与可能已经编译多年且源代码不一定总是可用的旧代码正确链接非常重要。 - supercat
__int128
必须被视为“扩展整数类型”。 - T.C.intmax_t
至少要有 128 位长,而我也怀疑 C 标准是否有这样的规定。 - Brian Bi__int128
的东西,它的行为就像整数一样,但这并不意味着在intmax_t
有关的意义上它真的是一个整数。另一方面,如果实现提供了int128_t
,那么intmax_t
就必须至少和它一样大。因此,一个可能的解释是当编译器特定的扩展被禁用时,实现不希望类型intmax_t
改变,但我不知道这是否是真正的原因。 - Steve Jessopintmax_t
(或uintmax_t
)必须能够表示它。但是编译器也可以提供一种不是扩展整数类型,但类似于整数类型的类型。而且改变intmax_t
的定义将会破坏ABI,所以没有编译器实际上将__int128
视为扩展整数类型。 - T.C.intmax_t
的意义。 C 代码不应该依赖于它具有特定的宽度。 - Keith Thompson