为什么没有int128_t?

43 c c++ c++-standard-library c-standard-library

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

据我记得,标准

  • int128_t为此目的储备
  • 鼓励提供这种类型的实现来提供typedef
  • 要求此类实现提供intmax_t至少128位

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

Kei*_*son 23

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

我知道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_t并且uintmax_t仅是64位.

在我看来,这是不幸的,但我不相信它会使gcc不合格.没有可移植程序可以依赖于__int12864位以上的任何整数类型的存在.

  • 我相信标准委员会把选择权交给了实施者。这将与其他“松散性”(如可选 VLA)收敛。 (2认同)