当我不想要它们时,我会向我发出 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。
如果我对此有所了解,那么对于模糊方法来说,这可能是文档的重要性。
答案 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);