为什么没有int128_t?

时间:2015-04-14 22:51:02

标签: c++ c c++-standard-library c-standard-library

许多编译器提供128位整数类型,但我使用过的都没有提供typedef int128_t。为什么呢?

据我记得,标准

  • 为此目的预留int128_t
  • 鼓励提供此类型的实现提供typedef
  • 要求此类实现提供至少128位的intmax_t

(并且,我不相信我已经使用了实际符合最后一点的实现)

1 个答案:

答案 0 :(得分:24)

我将参考C标准;我认为C ++标准从C继承了<stdint.h> / <cstdint>的规则。

我知道gcc在某些平台上实现了128位有符号和无符号整数,名称为__int128unsigned __int128__int128是一个实现定义的关键字)。

即使是提供标准128位类型的实现,标准也不会要求 int128_tuint128_t。引用C标准N1570草案的第7.20.1.1节:

  

这些类型是可选的。但是,如果实现提供   宽度为8,16,32或64位的整数类型,无填充位,   和(对于签名类型)有两个补码   表示,它应定义相应的typedef名称。

C允许实现定义扩展整数类型,其名称是实现定义的关键字。 gcc的__int128unsigned __int128非常类似于标准定义的扩展整数类型 - 但gcc不会这样对待它们。相反,它将它们视为语言扩展。

特别是,如果__int128unsigned __int128扩展整数类型,则需要gcc将intmax_tuintmax_t定义为类型(或某些类型至少128位宽)。它没有这样做;相反,intmax_tuintmax_t只有64位。

在我看来,这是不幸的,但我不相信这会让gcc不合规。没有可移植程序可以依赖于__int128的存在,或者取决于宽于64位的任何整数类型。