在C#中我看到-1 * int.MinValue == int.MinValue ??這是一個錯誤?
-1 * int.MinValue == int.MinValue
這是一個錯誤?當我試圖實現搜索樹時,它真的讓我感到困擾。我結束了使用(int.MinValue + 1)
,以便我可以正確否定它。
在C#中我看到-1 * int.MinValue == int.MinValue ??這是一個錯誤?
-1 * int.MinValue == int.MinValue
這是一個錯誤?當我試圖實現搜索樹時,它真的讓我感到困擾。我結束了使用(int.MinValue + 1)
,以便我可以正確否定它。
這不是一個錯誤。
int.MinValue * -1
是1
大於int.MaxValue
可以容納。因此,該數字回到int.MinValue
。
這基本上是由整數溢出引起的。
此常數的值是
-2,147,483,648
此常數的值是
2,147,483,647
因此,-2,147,483,648 * -1 = 2,147,483,648
這是1
大於Int32.MaxValue
。
這不是一個錯誤,它是一個溢出。
在two's complement表示中,可表示的數字的空間不是對稱的。最小整數的相反值不能被表示。計算它溢出並再次給你相同的數字。
不到一秒鐘,我想你會說這不是一個錯誤,它是一個功能。 :D – Jonathan 2010-09-01 21:48:30
int i = -1 * int.MinValue;
這還不編譯除非您禁用檢查:
error CS0220: The operation overflows at compile time in checked mode
只是想說明,檢查模式顯然是默認禁用的.http://msdn.microsoft.com/en-us/library/h25wtyxf.aspx – Aelphaeis 2014-07-31 13:59:36
不,這是不是一個錯誤。這是二進制補碼整數算術的本質。
例如,讓我們取一個有符號的字節值,其值在-128
和127
之間。
127(0x7f)+1 = 128(0x80)
。然而,0x80
實際上是-128
的二進制表示。
因此,一個字節,128(0x80) = -128(0x80)
所以-128(0x80) * -1 = 128(0x80) = -128(0x80)
穿上它選中的區域,看到了「錯誤」演變成一個例外。或者嘗試使用VB.NET(據我所知,這是默認情況下與C#不同)。
+1提到檢查狀態。 – Aelphaeis 2014-07-31 14:00:27
+1非常有趣和有趣的問題:D – Jonathan 2010-09-01 21:46:52
這是我真的不明白的事情之一,爲什麼默認情況下C#沒有選中? – Aelphaeis 2014-05-30 21:00:30