2016-04-04 58 views
5

我想使用C#將大於int32最大範圍的大數轉換爲int32。所以如果它超過最大範圍2147483647,那麼它將從-2147483648再次開始。現在我這樣做是這樣的:將Int32.Maximum +數值轉換爲int32

long val = 3903086636L; 
long rem = val % 2147483648L; 
long div = val/2147483648L; 
int result = div % 2 == 0 ? (int)rem - 1 : -2147483648 + (int)rem; 

我不確定,如果我這樣做是正確的。是否有任何實用功能或快速的方式來在C#中做到這一點?

回答

5

如果你沒有啓用checked mode,只是投放您預期的那樣將處理溢出:

int i = (int)val; 

或者,由馬修·沃森建議,使其編譯器設置獨立的:

int i = unchecked((int)val); 

這不會引發異常。該整數將溢出並繼續從int.MinValue開始計數。

證明:

long val = (long)int.MaxValue + 1; 
int result = (int)val; 

Console.WriteLine(result == int.MinValue); // true 
+0

如果我禁用檢查模式,會影響我的應用程序嗎? – Arnab

+0

默認情況下,它被禁用,所以沒有。 –

+4

或者你可以編寫'int i = unchecked((int)val);',無論編譯器的checked選項如何,它都可以工作。 –

0

爲什麼不休息只需添加到int.MinValue

long tmp = myValue - int.MaxValue; 
while(tmp > int.MaxValue) tmp -= int.MaxValue; 

if (tmp > 0) tmp = int.MinValue + tmp; 

循環保留,你可以說也是大於2 * int.MaxValue數字工作。

如果您使用此選項並使用myValue = 3 * int.MaxValue + 1進行測試,您將得到2147483647

+1

如果'myValue'等於'4 * int.MaxValue',該怎麼辦? – wimh

+0

@Wimmel好點,我想我們需要一個循環在這種情況下,將盡快更新。 – HimBromBeere

+0

如果'myValue'等於'int.MaxValue + 1',我相信結果應該是'int.MinValue'而不是'int.MinValue + 1'。如果'myValue'等於'2 * int.MaxValue + 2',我相信結果應該是'0'而不是'int.MinValue + 2'。 – wimh

相關問題