2014-02-12 72 views
1

j的值是什麼?在選中和未選中的情況下編譯

Int32 i = Int32.MinValue; 
Int32 j = -i; 

在選中的上下文中編譯會引發異常。
未經檢查,我們獲得值Int32.MinValue

但爲什麼呢?

+0

但爲什麼不呢? ...請參閱關於按位編碼和2-s補碼的教程。 –

+1

因爲'Int32'沒有足夠的位來保存'-Int32.MinValue' – soon

+0

我明白這樣做的標誌性類型,它是正確的。我只是想更深層次地理解這一點 – dima

回答

4

這裏是最小和最大Int32值:

    Dec   Bin (first bit is a sign bit) 
Int32.MinValue -2147483648 10000000000000000000000000000000 
Int32.MaxValue 2147483647 01111111111111111111111111111111 

當你試圖讓-(-2147483648)有明確的溢出檢查你在這種情況下得到的異常,因爲2147483648是大於最大允許整型值。

那麼爲什麼你得到MinValue時,允許溢出?因爲當Int32.MinValue被否定時,你有2147483648其中有二進制表示10000000000000000000000000000000但有符號整數的第一位是一個符號位,所以你得到確切的Int32.Min值。

所以,這裏的問題是把第一位當作數字符號。如果你想分配否定Int32.Min值無符號整數的結果,你會得到2147483648值,符合市場預期:

Int32 i = Int32.MinValue; 
UInt32 j = (UInt32)-i; // it has 32 bits and does not treat first bit as sign 
3

這是整數溢出的一個例子。在檢查的上下文中,整數溢出將被檢測並轉換爲異常,因爲語言設計者決定如此。

要解釋整數溢出,你可以用二進制手工進行計算。要計算-X,以二進制形式將X全部更改爲0,將0更改爲1,然後加1(數字1,而不是1位)。

 
Example:  5 = 00000000000000000000000000000101 
flip all bits: 11111111111111111111111111111010 
add one:   11111111111111111111111111111011 which is -5 

Int32.MinValue = 10000000000000000000000000000000 
flip all bits: 01111111111111111111111111111111 
add one:   10000000000000000000000000000000 

如果你把Int32.MinValue和否定它,它不會改變。 -Int32.MinValue不能放在int中 - 如果你這樣做 - (Int64)Int32.MinValue它將按預期工作。

相關問題