我在/usr/include/limits.h中看到了
/* Minimum and maximum values a `signed long int' can hold. */
if __WORDSIZE == 64
define LONG_MAX 9223372036854775807L
else
define LONG_MAX 2147483647L
endif
define LONG_MIN (-LONG_MAX - 1L)
/* Maximum value an `unsigned long int' can hold. (Minimum is 0.) */
if __WORDSIZE == 64
define ULONG_MAX 18446744073709551615UL
else
define ULONG_MAX 4294967295UL
endif
ifdef __USE_ISOC99
/* Minimum and maximum values a `signed long long int' can hold. */
define LLONG_MAX 9223372036854775807LL
define LLONG_MIN (-LLONG_MAX - 1LL)
/* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */
define ULLONG_MAX 18446744073709551615ULL
Run Code Online (Sandbox Code Playgroud)
所以unsigned long long int
,unsigned long int
似乎有相同的最大值18446744073709551615 ...
这是否long long
意味着与long
本机相同?如果是这样,为什么我们有一个单独的long long
说明符?
从阅读C书籍,我预计long long
将增加一倍long
.我在某个地方出错了吗?(但是,是的,我同意的标准int >= short int
,long >= int
但它是难以消化long long >= long
.)
C语言规范指定符合实现必须提供的类型.long [int]
自标准的第一个版本以来,Type 就已经long long [int]
出现在其中,自C99以来,类型已经出现在其中.
该标准指定了各种整数类型的大小之间的关系,特别是该类型long long
必须能够表示类型long
可以表示的所有值,但它留下了类型特征的许多方面"实现已定义",这意味着实现选择(并且是有义务记录他们的选择).在这些特征中,是否有任何long long
超出范围的值long
.
在标准级别,这些都与实现的目标机器的本机字大小没有直接关系,但是当它们选择类型表示时,实现可以自由地使用它作为标准.
如果你关心的值的范围,您使用可以表示各种类型的,然后使用固定宽度类型从stdint.h
(int64_t
,uint32_t
等),或使用标准的宏给予整数类型的限制,(INT_MAX
和朋友).
你问:
那么这是否意味着 long long 与本机中的 long 相同
即使大小相同,类型名称也不同。
那么为什么我们有一个单独的
long long
说明符呢?`
该语言将它们指定为不同的类型。由平台决定使用多大的整数来支持它们。在您使用的编译器中long long
具有long
相同的大小。同一平台上的不同编译器可以对 和 使用 64 位,对和long long
使用 32 位。long
int