我写了代码:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int num= 2147483646;
printf("%d,%d" , num+1, num+2);
return 0;
}
,输出为-2147483647,-2147483648
当我向变量num添加2时,为什么数字变为负数?
答案 0 :(得分:5)
您确定输出不是2147483647, -2147483648
吗?我从来没有遇到2147483646
有效int
且2147483647
不是(尽管理论上可行)的平台。
C中溢出int
类型的行为是 undefined 。
这里似乎发生的是INT_MIN一旦达到INT_MAX就会转向(这个特定的未定义构造的相当常见的表现形式,但不依赖于此)。
答案 1 :(得分:2)
由于2147483647, -2147483648
类型的溢出,输出为int
。 4字节和2的补码实现中的这种类型的范围为[-2,147,483,648,2,147,483,647]。
你的溢出是未定义的行为。
答案 2 :(得分:-3)
C旨在尽可能地与计算机的工作方式协同工作。这意味着数字(或任何数据类型)以非常严格的方式在内存中表示。例如,整数由32位表示,具有2 ^ 32个可能的值。
根据您的计算机,有符号整数的范围为-2147483647到2147483647,其中无符号整数的范围为0到4294967295(请参阅https://msdn.microsoft.com/en-us/library/7fh3a000.aspx或http://www.cplusplus.com/reference/climits/)
计算机机械地添加数字,并且不检查添加是否导致它“超过”限制。相反,数字只是从最大可能值到最小可能值。