如何在整数除法上停止抛出OverflowException?

时间:2009-08-19 15:35:55

标签: c# .net math overflowexception

当我不想要它们时,我会向我发出 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的最大值,所以我希望丢弃溢出值y。

如果我对此有所了解,那么对于模糊方法来说,这可能是文档的重要性。

4 个答案:

答案 0 :(得分:6)

我相信这是唯一的案例,您将获得此异常。它是Int32范围内唯一可以溢出的区域。 (当然,除以零,但这是一个不同的例外。)

因此,如果您想避免OverflowException需要处理此案例。你想要它做什么?写一个方法来发现这个完全的情况,否则进行正常的划分。

注意:这也是为什么你不应该试图通过否定结果来反转比较。如果您想按降序排序而不是按升序排序,则不要使用-Compare(x, y)使用Compare(y, x)。否定不会int.MinValue提供溢出(除非您处于检查的上下文中) - 它只是默默地返回int.MinValue

答案 1 :(得分:3)

二进制补码意味着整数的范围是2 ^ 32 - 1到-2 ^ 32,所以-2147483648 / -1返回的数字不能用int表示。

您可以尝试将其放入long。在这种情况下没有理由使用var

答案 2 :(得分:0)

您可以通过对Int64进行一些强制转换来解决此问题:

var x = (int)((long)i / j);

答案 3 :(得分:0)

你这样做。你为什么要在这里使用var?它失去了向你显示所有用于保存1个字符的算术结果类型的能力......

long x = (long)i / j;

如果您想要饱和,可以:

int x = (int)Math.Min((long)i / j, int.MaxValue);