2010-09-01 45 views
46

在C#中我看到-1 * int.MinValue == int.MinValue ??這是一個錯誤?

-1 * int.MinValue == int.MinValue 

這是一個錯誤?當我試圖實現搜索樹時,它真的讓我感到困擾。我結束了使用(int.MinValue + 1),以便我可以正確否定它。

+5

+1非常有趣和有趣的問題:D – Jonathan 2010-09-01 21:46:52

+1

這是我真的不明白的事情之一,爲什麼默認情況下C#沒有選中? – Aelphaeis 2014-05-30 21:00:30

回答

57

這不是一個錯誤。

int.MinValue * -11大於int.MaxValue可以容納。因此,該數字回到int.MinValue

這基本上是由整數溢出引起的。

Int32.MinValue:

此常數的值是-2,147,483,648

Int32.MaxValue:

此常數的值是2,147,483,647

因此,-2,147,483,648 * -1 = 2,147,483,648這是1大於Int32.MaxValue

+1

整數數學是sooo coool! ;) – 2010-09-02 19:08:25

+1

@Mark,在這種情況下,我認爲它並不酷。這很混亂。 – jjnguy 2010-09-02 19:29:49

+0

取決於你如何看待它。從'-x:=〜x + 1'和'Int32。MinValue'是'1000 0000 0000 0000 0000 0000 0000 0000'這實際上很合理。而'Int32'中的'32'確實指向正確的方向:) – back2dos 2011-01-30 12:44:55

9

這不是一個錯誤,它是一個溢出。

two's complement表示中,可表示的數字的空間不是對稱的。最小整數的相反值不能被表示。計算它溢出並再次給你相同的數字。

+7

不到一秒鐘,我想你會說這不是一個錯誤,它是一個功能。 :D – Jonathan 2010-09-01 21:48:30

8
int i = -1 * int.MinValue; 

這還不編譯除非您禁用檢查:

error CS0220: The operation overflows at compile time in checked mode 
+0

只是想說明,檢查模式顯然是默認禁用的.http://msdn.microsoft.com/en-us/library/h25wtyxf.aspx – Aelphaeis 2014-07-31 13:59:36

2

不,這是不是一個錯誤。這是二進制補碼整數算術的本質。

例如,讓我們取一個有符號的字節值,其值在-128127之間。

127(0x7f)+1 = 128(0x80)。然而,0x80實際上是-128的二進制表示。

因此,一個字節,128(0x80) = -128(0x80)

所以-128(0x80) * -1 = 128(0x80) = -128(0x80)

2

穿上它選中的區域,看到了「錯誤」演變成一個例外。或者嘗試使用VB.NET(據我所知,這是默認情況下與C#不同)。

+0

+1提到檢查狀態。 – Aelphaeis 2014-07-31 14:00:27