如何解决C Int和Long 32-64位中的值的范围
| 我对C中Int变量的值范围感到困惑。 我知道32位无符号整数的范围是:0到65,535。 这么久有0到4,294,967,295 这在32bits机器中很好。但是现在在64位计算机中,所有事物都保持不变吗? 也许我的int能力不同? 我将这个问题理解为新手,但我真的很困惑。 此方法签名也无济于事。 :)unsigned long long int atomicAdd(unsigned long long int* address,unsigned long long int val);
解决方法
在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中的“ 2”未定义为32位。 int
和long
完全没有定义为任何特定大小。语言唯一保证的是sizeof(char)<=sizeof(short)<=sizeof(long)
。
从理论上讲,编译器可以使short
,char
和long
的位数相同。我知道有些人实际上为所有这些类型节省了7英镑。
这就是为什么C现在定义诸如uint16_t
和uint32_t
之类的类型的原因。如果需要特定大小,则应使用其中一种。
, 摘录自K&R:
“ 6”通常是16位,“ 4”是32位,“ 2”通常是16位或
32位。每个编译器可以自由选择适合自己的大小
硬件,仅受short
s和int
s的限制
至少16位,long
至少32位,short
否
大于int
,不大于which4ѭ。
您可以使用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);
}
也许您可能需要在计算机上进行一些调整,但这是一个很好的模板,可以让您开始了解(实现定义的)最小和最大值。
, 没有答案。该标准定义了最小范围。一个int必须至少能够容纳65535。但是,大多数现代编译器都允许int为32位值。此外,没有什么可以阻止多种类型具有相同的容量(例如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,即4,294,967,295 = 0xffffffff
因为int(有符号和无符号)的长度为32位,最大的长度如前所述。
(无符号short的最大值为2 ^ 16-1 = 65,535)
(unsigned)long long int将具有64位的长度(在大多数情况下,long int就足够了
64位Linux等,但该标准承诺将long long int设置为64位)。
因此,它们的范围为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语言的国际标准仅要求short变量的大小应小于或等于int类型的大小,而int类型的大小又应小于或等于long类型的大小。
, 看一下limits.h。您可以找到编译器的特定值。 INT_MIN和INT_MAX将很有趣。
, 查看系统中的limits.h
文件,它将告诉系统特定限制。或检查man limits.h
并转到“数值限制”部分。
, 一个32位无符号int的范围是0到4,295。 0到65535将是16位无符号。
无符号long long(在64位实现中,也可能是ulong和uint)的范围(至少)为0到18,446,744,073,709,551,615(264-1)。从理论上讲,它可能会更大,但至少到目前为止,这种情况不存在。
, 最好包括stdlib.h
。由于没有stdlibg,它需要很长时间
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。