我对 C 中 Int 变量的值范围感到困惑。
我知道 32 位无符号 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);
在 C 和 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
现在,在特定实现上,您有各种各样的位范围。维基百科的文章很好地描述了这一点。
不,C 中的int
未定义为 32 位。 int
和long
根本没有定义为任何特定大小。语言唯一保证的是 sizeof(char)<=sizeof(short)<=sizeof(long)
.
理论上,编译器可以使short
、char
和long
的位数相同。我知道有些人实际上对所有这些类型都这样做了,除了char
.
这就是为什么 C 现在定义了像 uint16_t
和 uint32_t
这样的类型。如果您需要特定尺寸,则应使用其中之一。
自K&R:
short
通常是 16 位、long
32 位,int
16 位或 32 位。每个编译器都可以自由选择适合自己的大小 硬件,仅受short
s 和int
的限制 至少 16 位,long
s 至少为 32 位,short
不是 长于int
,不长于long
。
您可以使用包含十进制/浮点类型限制定义的limits.h
:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>
int main(int argc, char** argv) {
printf("CHAR_BIT : %dn", CHAR_BIT);
printf("CHAR_MAX : %dn", CHAR_MAX);
printf("CHAR_MIN : %dn", CHAR_MIN);
printf("INT_MAX : %dn", INT_MAX);
printf("INT_MIN : %dn", INT_MIN);
printf("LONG_MAX : %ldn", (long) LONG_MAX);
printf("LONG_MIN : %ldn", (long) LONG_MIN);
printf("SCHAR_MAX : %dn", SCHAR_MAX);
printf("SCHAR_MIN : %dn", SCHAR_MIN);
printf("SHRT_MAX : %dn", SHRT_MAX);
printf("SHRT_MIN : %dn", SHRT_MIN);
printf("UCHAR_MAX : %dn", UCHAR_MAX);
printf("UINT_MAX : %un", (unsigned int) UINT_MAX);
printf("ULONG_MAX : %lun", (unsigned long) ULONG_MAX);
printf("USHRT_MAX : %dn", (unsigned short) USHRT_MAX);
printf("FLT_MAX : %gn", (float) FLT_MAX);
printf("FLT_MIN : %gn", (float) FLT_MIN);
printf("-FLT_MAX : %gn", (float) -FLT_MAX);
printf("-FLT_MIN : %gn", (float) -FLT_MIN);
printf("DBL_MAX : %gn", (double) DBL_MAX);
printf("DBL_MIN : %gn", (double) DBL_MIN);
printf("-DBL_MAX : %gn", (double) -DBL_MAX);
return (EXIT_SUCCESS);
}
也许您可能需要在计算机上进行一些调整,但这是一个很好的模板,可以开始了解(实现定义的(最小值和最大值。
没有一个答案。 该标准定义了最小范围。 int 必须能够容纳至少 65535。 然而,大多数现代编译器允许整数为 32 位值。 此外,没有什么可以阻止多种类型具有相同的容量(例如 int 和 long(。
话虽如此,标准确实在您的特定情况下说:
0 → +18446744073709551615
作为无符号长长 int 的范围。
延伸阅读: http://en.wikipedia.org/wiki/C_variable_types_and_declarations#Size
事实上,大多数现代处理器(ARM,Intel/AMD,Alpha,SPARC,Itanium,PowerPC(上的无符号int的范围为0到2^32 - 1,即4,294,967,295 = 0xffffffff因为 int(有符号和无符号(的长度为 32 位,最大的长度如前所述。
(无符号空头的最大值为 2^16 - 1 = 65,535 (
(无符号(长 long long int 的长度为 64 位(long int 在大多数情况下就足够了64 位 Linux 等,但标准承诺 64 位用于长 int(。因此,它们的范围为 0 到 2^64 - 1 = 18446744073709551615
在 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类型的大小。
看看 limits.h.您可以找到编译器的特定值。INT_MIN和INT_MAX会很有趣。
看看系统中的limits.h
文件,它会告诉系统特定的限制。或选中man limits.h
并转到"数值限制"部分。
32 位无符号 int 的范围为 0 到 4,294,967,295。 0 到 65535 将是 16 位无符号。
无符号长长(在 64 位实现中,可能还有 ulong 和可能还有 uint(的范围(至少(从 0 到 18,446,744,073,709,551,615 (264-1(。从理论上讲,它可能比这更大,但至少目前这种情况很少见甚至不存在。
最好包括stdlib.h
。因为没有标准libg需要很长时间