以下兩個操作是相同的。但是,由於「在檢查模式下編譯時操作溢出」,MaxValues1不會編譯。有人能解釋一下編譯器發生了什麼,以及如何避免在MaxValues2中使用硬編碼值?試圖在編譯時指定一個大數字
public const ulong MaxValues1 = 0xFFFF * 0xFFFF * 0xFFFF;
public const ulong MaxValues2 = 0xFFFD0002FFFF;
以下兩個操作是相同的。但是,由於「在檢查模式下編譯時操作溢出」,MaxValues1不會編譯。有人能解釋一下編譯器發生了什麼,以及如何避免在MaxValues2中使用硬編碼值?試圖在編譯時指定一個大數字
public const ulong MaxValues1 = 0xFFFF * 0xFFFF * 0xFFFF;
public const ulong MaxValues2 = 0xFFFD0002FFFF;
爲了得到簽名文字,添加u
後綴,並使其長l
後綴。即您需要ul
。
如果你真的想要溢出行爲,你可以添加unchecked
得到unchecked(0xFFFF * 0xFFFF * 0xFFFF)
但這可能不是你想要的。你會得到溢出,因爲文字被解釋爲Int32
而不是ulong
,並且0xFFFF * 0xFFFF * 0xFFFF
不適合32位整數,因爲它大約是2^48。
public const ulong MaxValues1 = 0xFFFFul * 0xFFFFul * 0xFFFFul;
「因而不適合長時間」。可能想改變這種說法? – 2012-04-05 00:23:55
@KendallFrey我已經重新制定了這個部分,並且不確定我寫的是不是很長或不適合int。長期當然是錯誤的。 – CodesInChaos 2012-04-05 00:26:25
我認爲它其實並不是一個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
這讓它工作。 0xFFFF實際上是硬編碼的常量,在我不能改變的源文件中。增加ulong似乎已經解決了這個問題。謝謝。 – 2012-04-05 00:24:56
@George,如果這解決了你的問題,你應該點擊答案左邊的複選標記。 – 2012-04-05 00:30:25
默認情況下,整數文字是的鍵入int
。您可以添加'UL'後綴以將其更改爲ulong
文字。
public const ulong MaxValues1 = 0xFFFFUL * 0xFFFFUL * 0xFFFFUL;
public const ulong MaxValues2 = 0xFFFD0002FFFFUL;
爲每個數字添加數字後綴'UL'。否則,C#將它們視爲Int32。
請添加相應的語言標記...... – 2012-04-05 00:15:03