我怎样才能阻止发生OverflowException抛出整数除法?
-
18-09-2019 - |
题
我得到的发生OverflowException 的扔给我时,我不希望他们(或因此我认为)。我进行了一些奇怪的计算,我期待值溢出,溢出丢弃位。看来我不能得到这个正常工作,虽然。基本上,这是一个对i的和j作为我遍历巨大集(int.MinValue到int.MaxValue)。这恰好
// i and j are ints
// i is -2147483648
// j is -1
var x = i / j;
// I also tried using unchecked keyword, but it doesn't help
var x = unchecked(i / j);
更新
的-2147483648 / -1的预期数学值为2147483648然而,该一定码并没有真正试图找到的数目。这是一个系列的走了有点难以理解位操作的事情的一部分。说实话,我甚至不知道自己的目的是什么,因为我并没有真正记录的方法,和所有的花,一天远离它在我的头上,以提高严重WTF气泡。我只知道它的工作原理是打算与设计用来处理情况特殊代码。
关于预期值:
由于INT只能容纳2147483647在它的最大值,我期望丢弃溢出屈服值0。
如果我了解这都什么,那可能是模糊的方法文档的重要性。
解决方案
我相信这是的只有的情况下,你会得到这个例外。这是可以溢出Int32
区域内的唯一部门。 (有由当然零除,但是这是一个不同的异常。)
所以,如果你想避免OverflowException
您的只有的需要来处理这种情况。你想做什么就做什么?写该识别这个确切情况下,以及以其他方式不正常分裂。
请注意:这也是为什么你不应该试图扭转仅通过否定的结果进行比较。如果你想按降序进行排序,而不是上升,然后,而不是使用-Compare(x, y)
使用Compare(y, x)
东西。否定的不的给溢出的int.MinValue
(除非在checked上下文是) - 它只是默默地返回int.MinValue
其他提示
二进制补码表示的整数的范围为2 ^ 32 - 1〜-2 ^ 32,所以-2147483648 / -1正在返回其不能由int
表示的数目
您可以尝试把它变成一个long
。没有理由在这种情况下使用var
。
可以与位流延到/从Int64
的解决办法此:
var x = (int)((long)i / j);
您做到这一点。为什么要使用var
这里?它失去了向您展示运算结果的类型全部为节能能力1个字符...
long x = (long)i / j;
如果你想饱和度,您可以:
int x = (int)Math.Min((long)i / j, int.MaxValue);