2011-11-24 402 views
0

當我寫這篇文章的代碼-1 * int.MinValue給出了一個錯誤

Console.WriteLine(-1 * int.MinValue); 

int a = -1 * -2147483648; 

我得到一個錯誤

的操作在檢查溢出在編譯時模式。

是否有編譯時檢查這個值? 還是實時計算所有書面表達式?

+1

'int.MinValue'不是'-21474048',它是'-2147483648' – BoltClock

+1

@BoltClock從內存中,是嗎? –

+0

我犯了一個錯誤,但沒關係 –

回答

9

編譯器能夠在編譯時執行(乘法)計算而不是運行時,所以它可以。

由於-1 * int.MinValue(-1 * -2,147,483,648,因此2,147,483,648)大於int.MaxValue(2,147,483,647),它會給你編譯錯誤。

證明它是不是特別的外殼您的確切說法,請嘗試:

Console.WriteLine(-2 * 1073741826); 

,你會得到相同的行爲。

+0

是否實時計算所有書面表達? –

+0

如果通過「計數」您的意思是「計算」,並且如果「實時」指「在編譯時」 - 那麼(根據我的理解)是的。 – mjwills

+0

@Artur Keyan:無論哪種表情都可以評估爲常量結果(即使用常量字面值)。如果你乘以一個像'-1 * someVar'這樣的數字變量,它不會優化它。 – BoltClock

3

Int(或更確切地說Int32)可以保存任何32位整數值。它的範圍從-2147483648到2147483647.

-1 * -2147483648 = 2147483648.並且這大於Int32的最大值。這就是你得到溢出的原因。

如果要執行計算,可以將其中一個值轉換爲Int64。所以這應該工作:

(Int64)(-1)*int.MinValue; 
3

有沒有必要這是一個特殊的檢查 - 價值自然溢出。這就像:

Console.WriteLine(int.MaxValue + 1); 

這顯然溢出int - 這是相同的值int.MinValue * -1

從部分中的C#4規格的7.19:

除非常量表達式被明確地放置在unchecked上下文中,的編譯時評價期間發生在整型算術運算和轉換溢出表達式總是會導致編譯時錯誤。

0

有運行時檢查值。 int值從-21474048到+21474047(爲什麼?2's complement)。所以你會得到一個異常。