C Int和Long的值范围32 – 64位

我混淆了C中intvariables的值范围

我知道32位unsigned int的范围是:0到65,535。 只有0到4,294,967,295

这在32位机器中很好。 但是现在在64位机器中,所有的东西都保持不变? 或者,也许我的整容能力是不同的?

我作为新手理解这个问题,但我真的很困惑。 这个方法签名也没有帮助。 🙂

unsigned long long int atomicAdd(unsigned long long int* address, unsigned long long int val); 

在C和C ++中,你有这些最less的要求(即实际的实现可以有更大的幅度)

 signed char: -2^07+1 to +2^07-1 short: -2^15+1 to +2^15-1 int: -2^15+1 to +2^15-1 long: -2^31+1 to +2^31-1 long long: -2^63+1 to +2^63-1 

现在,在特定的实现中,您有各种各样的位范围。 维基百科的文章很好地描述了这一点。

不,C中的int 定义为32位。 intlong没有被定义为任何特定的大小。 语言只保证sizeof(char)<=sizeof(short)<=sizeof(long)

从理论上讲,编译器可以使shortcharlong所有相同的位数。 我知道一些实际上为所有这些types保存char

这就是为什么C现在定义types如uint16_tuint32_t 。 如果你需要一个特定的尺寸,你应该使用其中的一个。

摘自K&R:

通常是16位, long 32位, int是16位或32位。 每个编译器可以自由地为自己的硬件select适当的大小,只受限于short s和int s至less为16位, long s至less为32位, short不长于int ,不再是int没有long


您可以使用limits.h ,其中包含十进制/浮点types限制的定义:

 #include <stdio.h> #include <stdlib.h> #include <limits.h> #include <float.h> int main(int argc, char** argv) { printf("CHAR_BIT : %d\n", CHAR_BIT); printf("CHAR_MAX : %d\n", CHAR_MAX); printf("CHAR_MIN : %d\n", CHAR_MIN); printf("INT_MAX : %d\n", INT_MAX); printf("INT_MIN : %d\n", INT_MIN); printf("LONG_MAX : %ld\n", (long) LONG_MAX); printf("LONG_MIN : %ld\n", (long) LONG_MIN); printf("SCHAR_MAX : %d\n", SCHAR_MAX); printf("SCHAR_MIN : %d\n", SCHAR_MIN); printf("SHRT_MAX : %d\n", SHRT_MAX); printf("SHRT_MIN : %d\n", SHRT_MIN); printf("UCHAR_MAX : %d\n", UCHAR_MAX); printf("UINT_MAX : %u\n", (unsigned int) UINT_MAX); printf("ULONG_MAX : %lu\n", (unsigned long) ULONG_MAX); printf("USHRT_MAX : %d\n", (unsigned short) USHRT_MAX); printf("FLT_MAX : %g\n", (float) FLT_MAX); printf("FLT_MIN : %g\n", (float) FLT_MIN); printf("-FLT_MAX : %g\n", (float) -FLT_MAX); printf("-FLT_MIN : %g\n", (float) -FLT_MIN); printf("DBL_MAX : %g\n", (double) DBL_MAX); printf("DBL_MIN : %g\n", (double) DBL_MIN); printf("-DBL_MAX : %g\n", (double) -DBL_MAX); return (EXIT_SUCCESS); } 

也许你可能需要稍微调整一下你的机器,但是这是一个很好的模板,可以开始了解(实现定义的)最小值和最大值。

没有人回答。 该标准定义了最小范围。 一个int必须能够保持至less65535.然而,大多数现代编译器允许整数是32位值。 另外,没有什么能够防止多种types具有相同的容量(例如int和long)。

话虽如此,标准确实在你的具体情况中说:

 0 → +18446744073709551615 

作为unsigned long long int的范围。

进一步阅读: http : //en.wikipedia.org/wiki/C_variable_types_and_declarations#Size

事实上,在大多数现代处理器(ARM,Intel / AMD,Alpha,SPARC,Itanium,PowerPC)上,unsigned int的取值范围为0到2 ^ 32 – 1,即4294967295 = 0xffffffff,因为int(signed和unsigned)是32位长,最大的是如上所述。

(无符号短将有最大值2 ^ 16 – 1 = 65,535)

(无符号)long long int的长度将是64位(long int在大多数64位Linux下是足够的,等等,但是long long long的标准是64位)。 因此它们的范围是0到2 ^ 64-1 = 18446744073709551615

在C和C ++内存中对一些variables的要求:

signed char: -2^07 to +2^07-1
short: -2^15 to +2^15-1
int: -2^15 to +2^15-1
long: -2^31 to +2^31-1
long long: -2^63 to +2^63-1

signed char: -2^07 to +2^07-1
short: -2^15 to +2^15-1
int: -2^31 to +2^31-1
long: -2^31 to +2^31-1
long long: -2^63 to +2^63-1

取决于硬件的编译器和体系结构

C语言的国际标准只要求短variables的大小应该小于或等于inttypes的大小,而inttypes的大小又应该小于或等于longtypes的长度。

看看limits.h 。 你可以find你的编译器的具体值。 INT_MIN和INT_MAX将是有趣的。

看看系统中的limits.h文件,它会告诉系统特定的限制。 或者检查man limits.h并转到“Numerical Limits”部分。

32位无符号整型的范围是从0到4,294,967,295。 0到65535将是一个16位无符号。

一个无符号的long long(在64位的实现中,也可能是ulong,也可能是uint)的范围(至less)是从0到18,446,744,073,709,551,615(2 64 -1)。 理论上它可能比这更大,但至less目前这种情况很less发生。

包含stdlib.h 。 由于没有stdlibg需要很长的时间