我想使用C#将一个大于int32最大范围的数字转换为int32。因此,如果它超过最大范围2147483647,那么它将从-2147483648再次开始。现在我这样做:
long val = 3903086636L;
long rem = val % 2147483648L;
long div = val / 2147483648L;
int result = div % 2 == 0 ? (int)rem - 1 : -2147483648 + (int)rem;
我不确定如果我这样做的话。在C#中有没有任何实用功能或快速方法?
答案 0 :(得分:5)
如果您没有启用checked mode,只需投射它就可以按预期处理溢出:
int i = (int)val;
或者,正如Matthew Watson所建议的那样,使编译器设置独立:
int i = unchecked((int)val);
这不会引发异常。整数将溢出并从int.MinValue
继续计数。
证明:
long val = (long)int.MaxValue + 1;
int result = (int)val;
Console.WriteLine(result == int.MinValue); // true
答案 1 :(得分:0)
为什么不简单地将其余内容添加到EmailType::
:
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
。