2015-10-13 86 views
2
class Program 
{ 
    static void Main(string[] args) 
    { 
     int a = Int32.MaxValue; 
     int b = Int32.MaxValue;    

     Console.WriteLine(a+b); 
    } 
} 

OUTPUT:发生-2为什么-2?为什么不是-3或-1?

溢出,但它是如何计算和找到-2结果?

+1

你为什么喜欢-3或-1? –

+0

@TimSchmelter我认为它只是一个普通的问题,运行时如何产生-2结果 – Domysee

+0

@TimSchmelter我不喜欢任何东西而不是其他东西,但它似乎很奇怪,它直接找到-2作为结果。 – Lyrk

回答

4

你加入相同数量的本身,所以我会在最不期望的总和是偶数。 (奇数+奇数=偶数)
但是为什么-2?

数行是一个循环:

 -1 0 
-2   1 
...    ... 
...    ... 
...    ... 
    -2147483648 2147483647 

添加1〜数字在效果上这圆一步顺时针服用。
添加1至2147483647(= int.MaxValue)带您-2147483648(= int.MinValue)

如果开始在2147483647并采取在圆2147483647个步骤,就结束了在-2。我们说溢出发生在int.MaxValue => int.MinValue上,它用十进制表示法,但是在二进制表示法中,溢出发生在-1(全1)=> 0(全部0的),在圆的另一侧。

8

把它写下来作为二进制字符串:

0111 1111 1111 1111 
+0111 1111 1111 1111 
-------------------- 
1111 1111 1111 1110 

而后者正好是-2。这是因为第一个数字是-2^31而不是2^31。因此,总和为-2^31 + 2^30 + 2^29 + ... + 2^2 + 2^1 = -2

(事实上,Int32有32位二进制数字,而不仅仅是16位)

+0

@Georg为什么后者是-2?第一位显示符号?你是这个意思? – Lyrk

+0

@Lyrk更新了我的答案。第一位不显示符号,但仅表示-2^31 – Georg

0

无论何时您overflowInt32.MaxValueInt32.MaxValue+count的值将变为Int32.MinValue+x。凡x = count-1

所以Int32.MaxValue+1 = -2147483648

-2147483648 + Int32.MaxValue-1 = -2

所以你的情况是-2147483648+(2147483647-1)这是-2