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

2024-03-02

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

例如,如果按照典型情况,最宽的有符号和无符号整数类型是long long int and unsigned long long int,两者通常都是 64 位,那么intmax_t and uintmax_t可能定义在<stdint.h>如下:

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

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

C99 和 C11 还允许实现定义扩展整数类型,它们与任何标准类型都不同,并且具有实现定义的关键字名称。

gcc 和 clang 在某些但不是所有目标上都支持类型__int128 and unsigned __int128。它们的行为类似于 128 位整数类型,但它们是not像...一样对待扩展整数类型,并且两个编译器的文档均声明它们不支持任何扩展整数类型。因为这些不是整数类型正如标准定义的术语,typedefsintmax_t and uintmax_t适用于 64 位类型,不适用于 128 位类型。

这些都没有违反 C 标准(实现不需要具有任何扩展整数类型,并且允许它们具有任意扩展,只要它们不破坏任何严格遵守的程序)。但在我看来,这对于__int128 and unsigned __int128被视为扩展整数类型,并且对于intmax_t and uintmax_t为 128 位类型。

理由not这样做的目的是改变intmax_t and uintmax_t将是“与 ABI 不兼容的更改”。

The Clang C++ 状态页面 http://clang.llvm.org/cxx_status.html在脚注(5)中说:

对于不提供任何扩展整数类型的实现(例如 Clang),不需要更改编译器。__int128不被视为扩展整数类型,因为改变intmax_t将是与 ABI 不兼容的更改。

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

In a 海湾合作委员会错误报告 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49595,提出如下主张:

sizeof(intmax_t)由各种 LP64 ABI 固定且无法更改

在这两种情况下,都没有给出该主张的参考资料。

An x86_64 ABI 文档 http://www.x86-64.org/documentation/abi.pdf标题为“System V 应用程序二进制接口,AMD64 架构处理器补充,草案版本 0.99.6”并没有提及intmax_t or uintmax_t,甚至是<stdint.h>标头。它确实指定了预定义整数类型的大小和对齐方式(如图 3.1 所示)。

最后,我的问题是:是否声称尺寸intmax_t and uintmax_t受 ABI 限制有效吗?如果是这样,什么 ABI 提出了这样的要求? (顺便问一下,为什么?)

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

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

参考:

  • N1256 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf,C99标准草案
  • N1570 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf,C11标准草案
  • N2303 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2303.pdf,Jens Gustedt 的提案
  • 系统 V AMD64 ABI http://www.x86-64.org/documentation/abi.pdf

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么 ABI(如果有)限制 [u]intmax_t 的大小? 的相关文章

随机推荐