intmax_t和long long int是相同的吗?

19
根据POSIX标准,intmax_t是一种有符号整数类型,能够表示任何有符号整数类型的值。
在C99/C11中,intmax_t的大小是否总是与long long int相同?

2
C99/C11定义了intmax_tlong long。为什么一个语言规范要定义两种完全做同样事情的整数类型呢?当然它们可能是不同的。 - chux - Reinstate Monica
3个回答

15

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


同意。我在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
3
正式地说,__int128并不是扩展整数类型,因为inttype_t被要求是包括扩展整数类型在内的最大有符号整数类型。就从符合规范的程序的角度来看,你应该假装它不存在 :-)。 - R.. GitHub STOP HELPING ICE
3
应该使用intmax_t而不是inttype_t。抱歉,4年时间已经超过了SO的编辑窗口限制。 - R.. GitHub STOP HELPING ICE

8

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 The following type designates a signed integer type capable of representing any value of any signed integer type:

intmax_t

6.4.4.1 整数常量 显然表明扩展的整数类型可能比任何标准整数类型都要大:

如果一个整数常量不能被其列表中的任何类型表示,那么它可以有一个扩展的整数类型,只要扩展的整数类型能够表示其值。


3
如果longlong long具有相同的宽度和表示形式(通常情况下是这样),则可以选择long作为intmax_t

1
@XTF 这个规则仅适用于Windows系统。在UNIX/Linux系统中(其中两种架构分别称为x86和x86_64),long的大小始终对应于指针的大小。 - S.S. Anne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接