许多编译器都提供 128 位整数类型,但我使用过的编译器都不提供 typedef
int128_t
。为什么?
据我记得,标准
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 名称。
C23 确实要求尽可能提供这些类型。引用N3096标准草案,7.22.2.1:
如果实现提供标准或扩展整数类型 具有特定的宽度并且没有填充位,它应定义 相应的 typedef 名称。
(这适用于精确宽度类型。C23 不再允许除二进制补码之外的有符号整数表示形式。)
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 兼容性问题。