我得到的发生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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top