根据POSIX标准,
在C99/C11中,
intmax_t
是一种有符号整数类型,能够表示任何有符号整数类型的值。在C99/C11中,
intmax_t
的大小是否总是与long long int
相同?没有任何一种intmax_t
可以是比long long
更大的扩展整数类型。我不知道有哪些系统将其定义为这样的类型,但您不应该在应用程序代码中假设它们相同。(如果您的操作系统始终保证它们相同,则在操作系统代码中假设它们相同可能是可接受的,但这仍然可能是一个坏主意。)
long long int
是最大的整数类型。可能会有比long long int
更大的整数类型,而C11要求这些类型可以表示为intmax_t
,但这将使intmax_t
大于long long int
。@user19192,你的假设是合理的,所以我会把这些sizeof
检查放到makefile或构建过程中,这样对于罕见的打破你假设的平台,你很快就会知道。 - Darren Stone__int128
并不是扩展整数类型,因为inttype_t
被要求是包括扩展整数类型在内的最大有符号整数类型。就从符合规范的程序的角度来看,你应该假装它不存在 :-)。 - R.. GitHub STOP HELPING ICEintmax_t
而不是inttype_t
。抱歉,4年时间已经超过了SO的编辑窗口限制。 - R.. GitHub STOP HELPING ICE6.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 整数常量 显然表明扩展的整数类型可能比任何标准整数类型都要大:
如果一个整数常量不能被其列表中的任何类型表示,那么它可以有一个扩展的整数类型,只要扩展的整数类型能够表示其值。
long
和long long
具有相同的宽度和表示形式(通常情况下是这样),则可以选择long
作为intmax_t
。long
的大小始终对应于指针的大小。 - S.S. Anne
intmax_t
和long long
。为什么一个语言规范要定义两种完全做同样事情的整数类型呢?当然它们可能是不同的。 - chux - Reinstate Monica