gpt4 book ai didi

c - 什么 ABI(如果有的话)限制 [u]intmax_t 的大小?

转载 作者:太空狗 更新时间:2023-10-29 16:29:52 25 4
gpt4 key购买 nike

从 1999 版开始,ISO C 标准定义了一个标准头文件 <stdint.h>其中定义了类型定义 intmax_tuintmax_t .它们分别指定“能够表示任何(有符号|无符号)整数类型的任何值的(有符号|无符号)整数类型”。

例如,如果按照典型情况,最宽的有符号和无符号整数类型是 long long intunsigned long long int ,两者通常都是 64 位,然后是 intmax_tuintmax_t可能在 <stdint.h> 中定义如下:

typedef long long int intmax_t;
typedef unsigned long long int uintmax_t;

有一组有限的预定义有符号和无符号整数类型,范围从 signed , unsigned , 和普通 char最多 signedunsigned long long int .

C99 和 C11 还允许实现定义扩展整数类型,这些类型不同于任何标准类型,并且名称是实现定义的关键字。

gcc 和 clang 在一些但不是所有目标上都支持类型 __int128unsigned __int128 .它们的行为类似于 128 位整数类型,但它们被视为扩展整数类型,并且两个编译器的文档都声明它们不支持任何扩展整数类型。因为这些不是标准定义术语的整数类型,typedefs intmax_tuintmax_t适用于 64 位类型,而非 128 位类型。

这些都没有违反 C 标准(实现不需要任何扩展整数类型,并且只要它们不破坏任何严格符合的程序,它们就可以具有任意扩展)。但在我看来,这对 __int128 来说非常有意义。和 unsigned __int128被视为扩展整数类型,对于 intmax_tuintmax_t为 128 位类型。

这样做的理由是改变 intmax_t 的大小和 uintmax_t将是“与 ABI 不兼容的更改”。

Clang C++ status page在脚注 (5) 中说:

No compiler changes are required for an implementation such as Clang that does not provide any extended integer types. __int128 is not treated as an extended integer type, because changing intmax_t would be an ABI-incompatible change.

(是的,这主要讨论 C++,但规则与 C 相同。)

gcc bug report 中, 声称:

sizeof(intmax_t) is fixed by various LP64 ABIs and cannot be changed

在这两种情况下,都没有为此声明提供引用。

x86_64 ABI document标题为“System V Application Binary Interface, AMD64 Architecture Processor Supplement, Draft Version 0.99.6”没有提到 intmax_tuintmax_t ,甚至是 <stdint.h> header 。它确实为预定义的整数类型指定了大小和对齐方式(在图 3.1 中)。

最后,我的问题是:是否声称 intmax_t 的大小和 uintmax_t受 ABI 有效限制?如果是这样,是什么 ABI 强加了这样的要求? (顺便说一句,为什么?)

(在我看来,这样的要求,如果存在的话,是不明智的。它违背了 C 标准允许定义扩展整数类型的目的,以及 intmax_tuintmax_t 的预期含义。它使它在支持它们的系统上有效地使用 128 位整数类型要困难得多,同时在其他系统上回退到更窄的类型。)

更新:在标题为“intmax t,出路”的 N2303 中,Jens Gustedt 建议调整 [u]intmax_t 的定义。允许添加比 long long 宽的扩展整数类型无需更新 [u]intmax_t .例如,intmax_t可能是 long long 的类型定义,但实现仍然可以提供,比方说,__int128作为扩展整数类型

引用资料:

最佳答案

正如三十二上校所说,单方面进行此更改的编译器会中断传递 uintmax_t 参数或返回 uintmax_t 值的编译单元之间的调用。尽管 SysV ABI 没有定义如何传递这些类型,但实际上维护它们的定义是符合平台 ABI 的一部分。

即使不是这个 ABI 问题,编译器仍然无法单方面进行此更改,因为它需要对每个目标平台的 C 标准库进行匹配更改。具体来说,它至少需要更新 printfscanf 函数系列、imaxabsimaxdivstrtoimaxstrtoumax 及其变体。

关于c - 什么 ABI(如果有的话)限制 [u]intmax_t 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29927562/

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