2012-04-05 44 views
3

以下兩個操作是相同的。但是,由於「在檢查模式下編譯時操作溢出」,MaxValues1不會編譯。有人能解釋一下編譯器發生了什麼,以及如何避免在MaxValues2中使用硬編碼值?試圖在編譯時指定一個大數字

public const ulong MaxValues1 = 0xFFFF * 0xFFFF * 0xFFFF; 

public const ulong MaxValues2 = 0xFFFD0002FFFF; 
+0

請添加相應的語言標記...... – 2012-04-05 00:15:03

回答

4

爲了得到簽名文字,添加u後綴,並使其長l後綴。即您需要ul

如果你真的想要溢出行爲,你可以添加unchecked得到unchecked(0xFFFF * 0xFFFF * 0xFFFF)但這可能不是你想要的。你會得到溢出,因爲文字被解釋爲Int32而不是ulong,並且0xFFFF * 0xFFFF * 0xFFFF不適合32位整數,因爲它大約是2^48。

public const ulong MaxValues1 = 0xFFFFul * 0xFFFFul * 0xFFFFul; 
+0

「因而不適合長時間」。可能想改變這種說法? – 2012-04-05 00:23:55

+0

@KendallFrey我已經重新制定了這個部分,並且不確定我寫的是不是很長或不適合int。長期當然是錯誤的。 – CodesInChaos 2012-04-05 00:26:25

1

我認爲它其實並不是一個ulong,直到你在最後分配給它,嘗試

public const ulong MaxValues1 = (ulong)0xFFFF * (ulong)0xFFFF * (ulong)0xFFFF; 

MaxValues1你乘以3個的32位整數在一起,結果被暗示爲其他32位,其溢出詮釋,當你把操作變化乘以3 ulongs在一起,這將不會溢出,因爲你推斷結果是ulong

(ulong)0xFFFF * 0xFFFF * 0xFFFF; 

0xFFFF * (ulong)0xFFFF * 0xFFFF; 

也爲結果類型爲基礎計算的最大類型的工作

0xFFFF * 0xFFFF * (ulong)0xFFFF; 

將不能作爲第2工作將溢出INT

+0

這讓它工作。 0xFFFF實際上是硬編碼的常量,在我不能改變的源文件中。增加ulong似乎已經解決了這個問題。謝謝。 – 2012-04-05 00:24:56

+0

@George,如果這解決了你的問題,你應該點擊答案左邊的複選標記。 – 2012-04-05 00:30:25

2

默認情況下,整數文字是的鍵入int。您可以添加'UL'後綴以將其更改爲ulong文字。

public const ulong MaxValues1 = 0xFFFFUL * 0xFFFFUL * 0xFFFFUL; 

public const ulong MaxValues2 = 0xFFFD0002FFFFUL; 
相關問題