gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:54:09 25 4
gpt4 key购买 nike

我的问题很简单:因为 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 标准甚至建议使用实现定义的关键字,这些关键字“具有为任何用途保留的标识符形式”作为扩展整数类型的名称——例如 __int128_t .

2011 C++ 标准采用了 C99 的扩展整数类型特性,并遵从 1999 C 标准对 intmax_t 的定义。和 <stdint.h> .

所以如果__int128_t是标准定义的整数类型(它肯定可以),顾名思义,是 128 位宽,然后是 intmax_t必须至少为 128 位宽。

作为Stephen Canon's answer , 改变 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");
}
}

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

This should not happen

如果 gcc 符合标准,那么只有在 __int128_t 时才有可能不是整数类型——而是引用 gcc 4.8.2 manual (强调):

As an extension the integer scalar type __int128 is supported for targets which have an integer mode wide enough to hold 128 bits. Simply write __int128 for a signed 128-bit integer, or unsigned __int128 for an unsigned 128-bit integer. There is no support in GCC for expressing an integer constant of type __int128 for targets with long long integer less than 128 bits wide.

我想有人会争辩说“作为扩展”这个短语让 gcc 摆脱了困境,证明了 __int128_t 的存在。根据标准第 4 节第 6 段:

A conforming implementation may have extensions (including additional library functions), provided they do not alter the behavior of any strictly conforming program.

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

There may also be implementation-defined extended signed integer types.

(我个人认为,使 intmax_t 至少与 __int128_t 一样宽(如果存在)将更符合标准的意图,即使它(勉强)可能会争辩说它没有违反标准的字母。)

关于c++ - 为什么在 g++ std::intmax_t 中不是 __int128_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21265462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com