2012-04-15 63 views
12

這感覺像一個愚蠢的問題,但我似乎無法看到答案。我有一個UINT64,這是應該具有的UInt64和「該操作在檢查模式下編譯時溢出」

UInt64.MaxValue 18446744073709551615 

一個最大值。然而,當我嘗試分配一箇中等規模的數字,我得到的「這個溢出錯誤的操作在檢查模式在編譯時溢出」。如果我在「選中」塊包起來,然後它編譯並運行,就好像這個變量是零:

UInt64 value1 = 1073741824 * 8; // Compile error 
UInt64 value2 = 8589934592;  // Actual value - no error 

這是爲什麼?happenning

+0

啊是的 - 這絕對會解釋它!多謝你們! – 2012-04-15 23:57:37

回答

23

因爲:

UInt64 value1 = 1073741824 * 8; 

是做算術作爲有符號的32位整數,然後其轉換爲ulong。請嘗試:

UInt64 value1 = 1073741824UL * 8; 

0123〃表示該文字是無符號長整型。更多關於文字後綴看到C#規範的2.4.4節:

如果文字是由UL,UL,UL,UL,LU,路,LU,或Lu後綴,它是ulong類型

4

1073741824int而不是UInt64
因此,您的乘法溢出了32位有符號整數的限制。

ul(無符號長整型)後綴添加到任一操作數中。

1

因爲你int,而不是long 1073741824操作你有一個錯誤仍然是int(最大爲int爲2147483647)。
所以在第一種情況下,你會得到int類型的溢出。
更改第一表達:

UInt64 value1 = 1073741824L * 8; 

和問題就會消失。

+0

沒有注意到您使用無符號值進行操作。對於無符號長整型,您應該使用1073741824UL而不是1073741824L。 – 2012-04-16 00:01:51