2016-04-04 57 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

相关问题