Vin*_*ent 12 c c++ standards gcc integer
我的问题非常简单:根据cppreference的std::intmax_t
定义,为什么它与GCC 不对应?maximum width integer type
__int128_t
Kei*_*son 14
我认为这违反了C和C++标准 - 或者gcc不认为__int128_t
是整数类型.
C标准(1999年和2011年版本)不要求intmax_t
成为标准类型之一; 它必须是"能够表示任何有符号整数类型的任何值的有符号整数类型".特别是,它可以是扩展的整数类型 - 如果存在128位扩展整数类型,则intmax_t
必须至少为128位宽.
C标准甚至建议使用实现定义的关键字"具有为任何用途保留的标识符的形式"作为扩展整数类型的名称 - 例如__int128_t
.
2011 C++标准采用C99的扩展整数类型特性,并且遵循1999 C标准的定义intmax_t
和<stdint.h>
.
因此,如果__int128_t
是标准定义的含义内的整数类型(它当然可以是),并且如名称所示,是128位宽,则intmax_t
必须至少为128位宽.
正如Stephen Canon的回答,改变intmax_t
确实需要一些工作.C和C++标准不承认这是intmax_t
错误定义的理由.
当然所有这些同样适用于uintmax_t
.
#include <stdio.h>
#include <stdint.h>
int main(void) {
__uint128_t huge = UINTMAX_MAX;
huge ++;
if (huge > UINTMAX_MAX) {
puts("This should not happen");
}
}
Run Code Online (Sandbox Code Playgroud)
在我的系统(Linux x86_64,gcc 4.7.2)上,上面的程序打印:
This should not happen
Run Code Online (Sandbox Code Playgroud)
如果gcc符合标准,那么只有当__int128_t
它不是整数类型时才应该可行- 但是引用gcc 4.8.2手册(强调添加):
作为扩展,整数标量类型
__int128
支持具有足够容纳128位的整数模式的目标.只需写入__int128
带符号的128位整数,或写入unsigned __int128
无符号的128位整数.GCC中不支持为整数小于128位的__int128
目标 表示类型的整数常量long long
.
我想有人可能会争辩说"作为一个扩展"一词让gcc摆脱困境,证明__int128_t
了标准第4节第6段的存在:
符合实现的实现可能具有扩展(包括附加库函数),前提是它们不会改变任何严格符合程序的行为.
而不是根据第6.2.6节第4段:
也可能存在实现定义的扩展有符号整数类型.
(我个人认为,intmax_t
至少尽可能宽__int128_t
,如果它存在,将更符合标准的意图,即使它(几乎不可能)认为它不违反标准的字母.)
Ste*_*non 12
更改intmax_t
不仅需要更改编译器,还需要更多需要接受intmax_t
参数的标准库函数(平台ABI也可以定义intmax_t
).编译器可以单方面提供__int128_t
扩展,但不能单方面改变类型intmax_t
.这需要编译器所针对的所有标准库实现的支持.
__int128 的功能不足以用作 intmax_t
stdint.h 头文件必须包含一个定义 INTMAX_C(9999999999999999999999) 这个定义允许你将一个常量输入到 C 源代码中,用于任何值直到类型的最大大小。
GCC 文档说“GCC 不支持为具有小于 128 位宽的 long long 整数的目标表达 __int128 类型的整数常量。”
因此,它不能用于 intmax_t。