我可以读到int范围(签名)来自[-32767,+ 32767] 但我可以说,例如
int a=70000;
int b=71000;
int c=a+b;
printf("%i", c);
return 0;
输出为141000(正确)。调试器不应该告诉我 “此操作超出范围”或类似的东西?
我认为这必须与我无视C编程的基础知识,但我目前正在阅读的所有书籍都没有说明这个“问题”。
编辑: 2147483647似乎是上限,谢谢。如果总和超过该数字,则结果为负,这是预期的,但是如果它是减法,例如: 2147483649-2147483647 = 2 ,结果仍然是好的。我的意思是,为什么值2147483649正确地适用于减法目的(或者至少在我看来)?
答案 0 :(得分:6)
范围[-32767,+ 32767]是必需的最小范围。允许实现提供更大的范围。
答案 1 :(得分:3)
在C ++中,int
至少 16位长,但在现代硬件上通常为32位。您可以撰写INT_MIN
和INT_MAX
并自行检查。
请注意,有符号整数溢出是未定义的行为,除了高编译器警告和调试模式之外,您不能保证得到警告。
答案 2 :(得分:3)
所有类型都依赖于编译器。 int
曾经是底层硬件的“本地字”,在16位系统上意味着int
是16位(这导致-32k到+ 32k范围)。当32位系统开始出现时,int
自然跟随并成为32位,可以存储大约20亿到+20亿的值。
然而,当{64}系统出现时,这个用于int
的“本地词”没有跟随,我知道没有64位系统或编译器int
是64位。
参见例如this reference of integer types了解更多信息。
答案 3 :(得分:2)
你误会了。标准保证 int
持有[-32767,+ 32767],但允许保留更多。 (特别是,您可能使用的几乎所有编译器都允许范围[-2147483648,2147483647]。
还有另一个问题。如果您将分配给a和b的值更大,那么您仍然可能不会收到任何警告或错误。整数溢出会导致“未定义的行为”,并且允许任何事情发生。
答案 4 :(得分:1)
如果int是4个字节,则unsigned是4294967295,signed max。 2147483647并签署了分钟。 -2147483648
unsigned int ui = ~0;
int max = ui>>1;
int min = ~max;
int size = sizeof(max);
答案 5 :(得分:0)
虽然标准保证int
的大小为16位,但通常将其实现为32位值。
答案 6 :(得分:0)
int
的大小(以及它可以容纳的最大值)取决于您使用的编译器和计算机。不能保证它有2个字节或4个字节,但c ++变量有保证的最小大小。
您可以在此页面中看到c ++类型的最小大小列表:http://www.cplusplus.com/doc/tutorial/variables/