为什么没有int128_t类型?

64

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

据我所知,标准:

  • 保留了int128_t作为此目的的保留名称
  • 鼓励实现提供此类类型并提供typedef
  • 强制要求此类实现至少提供一个128位的intmax_t

(而且,我不相信我使用过符合最后一点规定的实现)


2
标准并没有规定__int128必须被视为“扩展整数类型”。 - T.C.
1
你使用的是哪种编程语言?我很确定 C++ 标准并没有规定 intmax_t 至少要有 128 位长,而我也怀疑 C 标准是否有这样的规定。 - Brian Bi
4
@Hurkyl: 是的,实现提供了一个称为 __int128 的东西,它的行为就像整数一样,但这并不意味着在 intmax_t 有关的意义上它真的是一个整数。另一方面,如果实现提供了 int128_t,那么 intmax_t 就必须至少和它一样大。因此,一个可能的解释是当编译器特定的扩展被禁用时,实现不希望类型 intmax_t 改变,但我不知道这是否是真正的原因。 - Steve Jessop
1
如果编译器提供了扩展整数类型,那么intmax_t(或uintmax_t)必须能够表示它。但是编译器也可以提供一种不是扩展整数类型,但类似于整数类型的类型。而且改变intmax_t的定义将会破坏ABI,所以没有编译器实际上将__int128视为扩展整数类型。 - T.C.
4
很遗憾,我认为这样做背离了 intmax_t 的意义。 C 代码不应该依赖于它具有特定的宽度。 - Keith Thompson
显示剩余9条评论
1个回答

34

我将参考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位更宽的整数类型。而且改变intmax_tuintmax_t将导致严重的ABI兼容性问题。


1
补充一下,__int128 出现在子条款 J.5.6(其他算术类型)中,因此它可能被视为编译器的扩展。这与 GCC 的文档 是一致的,即:GCC 不支持任何扩展整数类型。 - Grzegorz Szpetkowski
1
@GrzegorzSzpetkowski:这是C90中类似句子的改写:“其他算术类型,如long long int及其适当的转换已定义”;它早于C99和扩展整数类型的引入。(它在“可移植性问题”的附录的“常见扩展”部分中。)我觉得奇怪的是,标准和gcc都支持添加新的整数类型的扩展,但不使用“扩展整数类型”的机制。 - Keith Thompson
2
我相信标准委员会将选择权交给了实现者。这将与其他“宽松”特性(如可选的VLAs)趋于一致。 - Grzegorz Szpetkowski
1
这是一个编译器,如果添加了128位类型来扩展intmax_t,那么任何使用该类型并在类型扩展后编译的代码将无法与在类型扩展之前编译的代码链接。在许多情况下,能够使新代码与可能已经编译多年且源代码不一定总是可用的旧代码正确链接非常重要。 - supercat
1
@KeithThompson:或许有人希望存在更好的解决方法,但这并不意味着一定存在。在16位到32位的过渡期间,很多问题本可以避免,而且如果有一个指令能够在代码块中将内置类型视为特定大小(如果编译器支持的话),那么在转换到更大类型时也可以避免很多问题。在使用不同大小的整数类型的上下文之间进行数据交换时,需要通过具有相同大小的类型来完成。 - supercat
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接