在64位机器中,长期和长期在C中有相同的范围吗?

Har*_*nam 5 c linux

我在/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.)

Joh*_*ger 5

C语言规范指定符合实现必须提供的类型.long [int]自标准的第一个版本以来,Type 就已经long long [int]出现在其中,自C99以来,类型已经出现在其中.

该标准指定了各种整数类型的大小之间的关系,特别是该类型long long必须能够表示类型long可以表示的所有值,但它留下了类型特征的许多方面"实现已定义",这意味着实现选择(并且是有义务记录他们的选择).在这些特征中,是否有任何long long超出范围的值long.

在标准级别,这些都与实现的目标机器的本机字大小没有直接关系,但是当它们选择类型表示时,实现可以自由地使用它作为标准.

如果你关心的值的范围,您使用可以表示各种类型的,然后使用固定宽度类型从stdint.h(int64_t,uint32_t等),或使用标准的宏给予整数类型的限制,(INT_MAX和朋友).


R S*_*ahu 3

你问:

那么这是否意味着 long long 与本机中的 long 相同

即使大小相同,类型名称也不同。

那么为什么我们有一个单独的long long说明符呢?`

该语言将它们指定为不同的类型。由平台决定使用多大的整数来支持它们。在您使用的编译器中long long具有long相同的大小。同一平台上的不同编译器可以对 和 使用 64 位,对和long long使用 32 位。longint