许多编译器提供128位整数类型,但我使用过的都没有提供typedef int128_t
。为什么呢?
据我记得,标准
int128_t
intmax_t
(并且,我不相信我已经使用了实际符合最后一点的实现)
答案 0 :(得分:24)
我将参考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位的任何整数类型。