我对C中Int变量的值范围感到困惑。
我知道32位unsigned int的范围是:0到65,535。 这么久有0到4,294,967,295
这在32位机器上很好。但现在64位机器的所有东西保持不变? 或者也许我的int容量不同?
我把这些问题理解为新手,但我真的很困惑。 这种方法签名也没有帮助。 :)
unsigned long long int atomicAdd(unsigned long long int* address, unsigned long long int val);
答案 0 :(得分:67)
在C和C ++中,你有这些最低要求(即实际实现可以有更大的量级)
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
现在,在特定实现中,您有多种位范围。 wikipedia article很好地描述了这一点。
答案 1 :(得分:19)
不,C中的int
不定义为32位。 int
和long
未定义为任何特定大小。语言唯一保证的是sizeof(char)<=sizeof(short)<=sizeof(long)
。
理论上,编译器可以使short
,char
和long
具有相同的位数。我知道char
保存uint16_t
所有类型的actually did that。
这就是C现在定义uint32_t
和{{1}}等类型的原因。如果你需要特定的尺寸,你应该使用其中一种。
答案 2 :(得分:18)
摘录自K&amp; R:
short
通常为16位,long
32位且int
为16位或 32位。每个编译器都可以自由选择合适的大小 硬件,仅受short
和int
s的限制 至少16位,long
s至少为32位,short
为否 超过int
,不超过long
。
您可以使用包含decimal / float类型限制定义的limits.h
:
#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);
}
也许您可能需要在机器上进行一些调整,但这是一个很好的模板,可以开始了解(实现定义的)最小值和最大值。
答案 3 :(得分:9)
没有人回答。该标准定义了最小范围。 int必须能够保持至少65535.但是大多数现代编译器允许int为32位值。此外,没有什么能阻止多种类型具有相同的容量(例如int和long)。
话虽如此,标准确实在你的具体案例中说:
0 → +18446744073709551615
作为unsigned long long int的范围。
进一步阅读:http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size
答案 4 :(得分:2)
事实上,大多数现代处理器(ARM,Intel / AMD,Alpha,SPARC,Itanium,PowerPC)上的unsigned int的范围为0到2 ^ 32 - 1,即4,294,967,295 = 0xffffffff 因为int(有符号和无符号)将是32位长,最大的一个是如上所述。
(无符号短路将具有最大值2 ^ 16 - 1 = 65,535)
(unsigned)long long int的长度为64位(long int在大多数情况下都足够了 64位Linux等,但标准承诺64位长long int)。 因此,这些范围为0到2 ^ 64-1 = 18446744073709551615
答案 5 :(得分:2)
在某些变量的C和C ++内存要求中:
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语言的国际标准只要求短变量的大小应小于或等于int类型的大小,而int类型的大小应小于或等于long类型的大小。
答案 6 :(得分:1)
看看limits.h。您可以找到编译器的特定值。 INT_MIN和INT_MAX将是有意义的。
答案 7 :(得分:1)
查看系统中的limits.h
文件,它将告诉系统特定的限制。或者检查man limits.h
并转到“数字限制”部分。
答案 8 :(得分:0)
32位unsigned int的范围是0到4,294,967,295。 0到65535将是16位无符号。
无符号长long(以及64位实现,也可能是ulong,也可能是uint)的范围(至少)为0到18,446,744,073,709,551,615(2 64 -1) 。理论上它可能比这更大,但至少现在这种情况很少见。
答案 9 :(得分:-5)
最好包含stdlib.h
。因为没有stdlibg需要很长时间