问题 intmax_t与long long int相同吗?


通过POSIX, intmax_t 指定一个有符号整数类型,能够表示任何有符号整数类型的任何值。

在C99 / C11中是否正确? intmax_t 总是和...一样大小 long long int


1111
2017-12-08 21:44


起源

C99 / C11定义 intmax_t  和  long long。为什么语言规范会定义两个始终完全相同的整数类型?当然,他们可能会有所不同。 - chux


答案:


没有。 intmax_t 可以是大于的扩展整数类型 long long。我不知道有任何系统将其定义为这样,但你不应该在应用程序代码中假设它们是相同的。 (假设它们在操作系统代码中是相同的,如果你的操作系统总能保证,但它仍然可能是一个坏主意。)


9
2017-12-08 21:50



同意。我在C11中看不到任何保证 long long int 成为最大可能的整数类型。可以有大于的整数类型 long long int 和C11要求那些可以代表 intmax_t然而,这将离开 intmax_t 比大 long long int。 @ user19192,你的假设是 合理 所以我只是把这些 sizeof 检查makefile或构建过程,以便 罕见 打破你的假设的平台,你很快就会知道。 - Darren Stone
GNU C具有128位整数类型 __int128 作为延伸。这是大于的整数类型的示例 long long 你在说什么?如果是的话,那似乎很奇怪 long long 和 intmax_t 在我的机器上是64位,而 __int128 是128位。 - countunique
从形式上看, __int128 因为,不是扩展的整数类型 inttype_t必须是包含扩展整数类型的最大有符号整数类型。从合规程序的角度来看,这只是你假装不存在的东西。 :-) - R..
inttype_t 本来应该 intmax_t。对不起4年多有点过了SO的编辑窗口.. - R..


C99 N1256标准草案

6.2.5类型 告诉我们“扩展有符号整数类型”:

4有五种标准的有符号整数类型,指定为signed char,short   int,int,long int和long long int。 (这些和其他类型可能是   如6.7.2所述,以其他几种方式指定。)也可能有   实现定义的扩展有符号整数类型   标准和扩展   有符号整数类型统称为有符号整数类型。 29)

29)因此,本标准中有关有符号整数类型的任何语句也适用于扩展   有符号整数类型。

7.18.1.5最大宽度整数类型 说 intmax_t 是最大可能的“有符号整数类型”,因此包括扩展类型:

1   以下类型指定能够表示任何值的有符号整数类型   任何有符号整数类型:

intmax_t

6.4.4.1整数常量 然后很清楚,扩展的整数类型可能比任何标准类型都要大:

6如果整数常量不能由其列表中的任何类型表示,则它可能具有   扩展整数类型,如果扩展整数类型可以表示其值。


3
2018-05-11 19:17





如果 long 和 long long 具有相同的宽度和表示,他们经常这样做, long 可以选择 intmax_t


1
2017-12-08 22:54



在x64和x86上 long 经常(总是?)32b而 long long 是64b。 - XTF