当我在c中添加一个具有正值的int时,为什么会变为负值?

时间:2017-11-01 12:01:20

标签: c

我写了代码:

#include <stdlib.h>
#include <stdio.h>

int main()
{

    int num= 2147483646;
    printf("%d,%d" , num+1, num+2);

    return 0;
} 

,输出为-2147483647,-2147483648

当我向变量num添加2时,为什么数字变为负数?

3 个答案:

答案 0 :(得分:5)

您确定输出不是2147483647, -2147483648吗?我从来没有遇到2147483646有效int2147483647不是(尽管理论上可行)的平台。

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.aspxhttp://www.cplusplus.com/reference/climits/

计算机机械地添加数字,并且不检查添加是否导致它“超过”限制。相反,数字只是从最大可能值到最小可能值。