为什么在g ++中std :: intmax_t不是__int128_t?

我的问题很简单:因为std::intmax_t被定义为根据cppreference的maximum width integer type ,为什么它不对应于GCC中的__int128_t

我认为这违反了C和C ++标准 – 要么就是这样,要么gcc不认为__int128_t是整数类型。

C标准(1999年和2011年版本)不要求intmax_t成为标准类型之一; 它必须是“能够表示任何有符号整数类型的任何值的有符号整数类型”。 特别是,它可以是扩展的整数类型 – 如果存在128位扩展整数类型,则intmax_t必须至少为128位宽。

C标准甚至建议使用实现定义的关键字“具有为任何用途保留的标识符的forms”作为扩展整数类型的名称 – 例如__int128_t

2011 C ++标准采用C99的扩展整数类型特性,并intmax_t 1999 C标准定义intmax_t

因此,如果__int128_t是标准定义的含义内的整数类型 (它当然可以是),并且如名称所示,是128位宽,则intmax_t必须至少为128位宽。

正如Stephen Canon的回答 ,改变intmax_t确实需要一些工作。 C和C ++标准不承认这是错误定义intmax_t的理由。

当然,所有这些同样适用于uintmax_t

 #include  #include  int main(void) { __uint128_t huge = UINTMAX_MAX; huge ++; if (huge > UINTMAX_MAX) { puts("This should not happen"); } } 

在我的系统(Linux x86_64,gcc 4.7.2)上,上面的程序打印:

 This should not happen 

如果gcc符合标准,那么只有当__int128_t不是整数类型时才应该这样 – 但引用gcc 4.8.2手册 (强调添加):

作为扩展, 整数标量类型 __int128支持具有足以容纳128位的整数模式的目标。 只需为带符号的128位整数写__int128 ,或为无符号的128位整数写unsigned __int128 。 GCC中不支持为long long整数小于128位宽的目标表达__int128类型的整数常量。

我想有人可能会争辩说“作为一个扩展”一词让gcc摆脱__int128_t ,certificate了该标准第4节第6段中__int128_t的存在:

符合条件的实现可能具有扩展(包括附加库函数),前提是它们不会改变任何严格符合程序的行为。

而不是根据第6.2.6节第4段:

也可能存在实现定义的扩展有符号整数类型

(我个人认为使intmax_t至少与intmax_t一样宽,如果存在的话,将更符合标准的意图 ,即使它(几乎没有)可以说它不违反标准的字母 。)

更改intmax_t不仅需要更改编译器,还需要更多需要接受intmax_t参数的标准库函数(平台ABI也可以定义intmax_t )。 编译器可以单方面提供__int128_t作为扩展,但不能单方面改变intmax_t类型。 这需要编译器所针对的所有标准库实现的支持。

__int128function不足以用作intmax_t

stdint.h头必须包含一个定义INTMAX_C(9999999999999999999999)。此定义允许您在C源中为任何值输入一个常量,直到该类型的最大大小。

GCC文档说“GCC中没有支持为长整数小于128位的目标表达__int128类型的整数常量。”

因此,它不能用于intmax_t。