为什么将自身两次减去int.MinValue会导致int.MinValue?

时间:2018-06-20 20:35:42

标签: c#

我试图不使用Math.Abs来获得数字的正值:

int small = -1000;
Console.WriteLine(small - small - small);
int big = int.MinValue;
Console.WriteLine(big - big - big);

第一种效果很好,可以打印1000张,但是第二种情况,则可以得到-2147483648而不是正数2147483648

我怀疑这与整数溢出有关,但我认为这没有意义,因为运算结果不应溢出整数边界。

例如:

(-2147483648) - (-2147483648) = 0
0 - (-2147483648) = 2147483648

(-2147483648) - (-2147483648) - (-2147483648) = 2147483648

我想念什么?

1 个答案:

答案 0 :(得分:5)

如您所说:

(-2147483648) - (-2147483648) = 0
0 - (-2147483648) = 2147483648

从数学上讲,这是可行的。但是,int.MaxValue21474836472147483648等效于int.MaxValue + 1,后者溢出,将结果包装回-2147483648