這真的很奇怪。我跟蹤這個錯誤:不同的鑄造行爲
Negating the minimum value of a twos complement number is invalid.
...和事實證明,這是由於這樣的代碼:
var valueFromUser = "470259123000000";
var doubleValue = Convert.ToDouble(valueFromUser, CultureInfo.InvariantCulture);
Math.Abs((int)doubleValue);
事實上,當我在LINQPad運行此:
(int)Convert.ToDouble("470259123000000", CultureInfo.InvariantCulture)
...它給了我:
-2147483648
然而,另一名開發人員在這裏說,他得到完全不同的東西(而不是在LINQPad):
-1141206336
當我試圖通過自身的恆定,以評估只是演員:
(int)470259123000000.0
...我由於需要unchecked
而出現編譯錯誤。而這個:
unchecked((int)470259123000000.0)
...評估爲-1141206336
像其他開發者得到。所以我想也許Convert
創造了一個微妙的不同於常數的值。不,這個計算結果爲True
:
Convert.ToDouble("470259123000000", CultureInfo.InvariantCulture) == 470259123000000.0
到底是什麼怎麼回事?爲什麼評估這些看起來相同的表達式會產生不同的結果?
更新:
找到一個提示。的4.70259123E14
和-1141206336
十六進制表示是:
0x42FABB2BBFA92C00
0xBBFA92C0
所以我想了鑄件一種是直接推搡位到int
。所以-2147483648
是更大的謎。
有趣。看起來像檢查和未檢查鑄件行爲之間的區別。使用高科技的「計算器」應用程序(當然在「程序員」模式;-)我可以看到'-1141206336'匹配'470259123000000'的截尾(32 lsb)。選中的版本似乎返回'int.MinValue'。我相信有人能夠在語言規範中指出這一點。 – Alex 2015-03-25 03:02:39