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

从1999版开始,ISO C标准定义了标准标题< stdint.h>其中定义了typedef intmax_t和uintmax_t.它们分别指定能够表示任何(有符号的无符号)整数类型的任何值的“(无符号的)无符号整数类型”.

例如,如果通常,最宽的有符号和无符号整数类型是long long int和unsigned long long int,两者都通常为64位,那么intmax_t和uintmax_t可以在< stdint.h>如下:

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

有一组有限的预定义有符号和无符号整数类型,从signed,unsigned和plain char到signed和unsigned long long int.

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

在一些但不是全部目标上,gcc和clang都支持类型__int128和无符号__int128.这些行为就像128位整数类型,但它们不被视为扩展整数类型,两个编译器的文档都声明它们不支持任何扩展整数类型.因为这些不是整数类型,因为标准定义了该术语,typedef intmax_t和uintmax_t用于64位类型,而不是128位类型.

这些都不违反C标准(实现不需要任何扩展的整数类型,只要它们不会破坏任何严格符合的程序,它们被允许具有任意扩展名).但是在我看来,对__int128和无符号__int128将被视为扩展整数类型,intmax_t和uintmax_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

在这两种情况下,都没有提及这一索赔.

名为“System V Application Binary Interface,AMD64 Architecture Processor Supplement,Draft Version 0.99.6”的x86_64 ABI document没有提到intmax_t或uintmax_t,甚至没有提到< stdint.h>头.它确定了预定义整数类型的大小和对齐方式(如图3.1所示).

最后,我的问题是:是否声称intmax_t和uintmax_t的大小受ABI限制?如果是这样,ABI是否施加了这样的要求? (还有,为什么呢?)

(在我看来,这样一个要求,如果存在的话,这是不明智的,它违反了C标准的定义扩展整数类型的目的以及intmax_t和uintmax_t的意图,这使得使用128-在支持它们的系统上有效地使用位整数类型,同时在其他系统上还原到较窄的类型.)

参考文献:

> N1256,C99标准草案
> N1570,C11标准草案
> System V AMD64 ABI

作为“三十一上校”笔记,单方面进行此更改的编译器会中断通过uintmax_t参数或返回uintmax_t值的编译单元之间的调用.即使SysV ABI没有定义这些类型是如何通过的,因为保持其定义的实用性是与ABI平台相一致的一部分.

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

http://stackoverflow.com/questions/29927562/what-abi-if-any-restricts-the-size-of-uintmax-t

转载注明原文:什么ABI(如果有的话)限制[u] intmax_t的大小?