j
的值是什麼?在選中和未選中的情況下編譯
Int32 i = Int32.MinValue;
Int32 j = -i;
在選中的上下文中編譯會引發異常。
未經檢查,我們獲得值Int32.MinValue
。
但爲什麼呢?
j
的值是什麼?在選中和未選中的情況下編譯
Int32 i = Int32.MinValue;
Int32 j = -i;
在選中的上下文中編譯會引發異常。
未經檢查,我們獲得值Int32.MinValue
。
但爲什麼呢?
這裏是最小和最大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
這是整數溢出的一個例子。在檢查的上下文中,整數溢出將被檢測並轉換爲異常,因爲語言設計者決定如此。
要解釋整數溢出,你可以用二進制手工進行計算。要計算-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它將按預期工作。
但爲什麼不呢? ...請參閱關於按位編碼和2-s補碼的教程。 –
因爲'Int32'沒有足夠的位來保存'-Int32.MinValue' – soon
我明白這樣做的標誌性類型,它是正確的。我只是想更深層次地理解這一點 – dima