我很好奇,所以我运行了几个测试来看看.NET如何处理溢出(我无法在任何地方找到它)。我几乎希望他们吐出溢出错误而不是结果,因为老实说这些结果只是奇怪的:
Int32.MaxValue + Int32.MaxValue = -2
我知道它包装,但为什么这样做而不是抛出OverflowException?是不是“未经检查”是为了......忽略溢出?我对于现在未经检查的内容感到困惑,特别是因为我已经看到它用于创建哈希值。
Double.PositiveInfinity + Double.NegativeInfinity = Double.NaN
另一个奇怪的是。 1 + -1 = 0. 100 + -100 = 0.那么为什么Infinity + -Infinity = NaN?
Double.PositiveInfinity / Double.PositiveInfinity = Double.NaN
再次,为什么奇怪?我想这应该是1或者可能是0(b / c的极限x /无穷大= 0)。事实上...... Double.MaxValue / Double.PositiveInfinity = 0
...
Double.PositiveInfinity / 0 = Infinity
什么!?没有DivideByZeroException!?
Double.MaxValue + Double.MaxValue = Infinity
是的,这个没有抛出OverflowException,但也没有环绕?所以我猜不是所有的原始类型都像int那样。奇怪的是,我可以做Double.MaxValue + 1 = 1.79769313486232E+308
之类的事情。因此,添加超出双倍的MaxValue是可能的(可能会失去精度?),但是在一些未知数字(它可能已被弄清楚 - 或已经存在)之后,它会失去显示有效数字并返回Infininty的能力?
好吧,其余的都是重复的。我只是想知道为什么这些按照他们的方式运作?特别是Double运营商。对于我来说,能够超越MaxValue是非常意外的。
答案 0 :(得分:5)
无限不是一个数字。它也不像数字。
如果我们让a
为正整数(1,2,3,...),b
是偶数的整数(2,4,6,... ),c
是奇数的整数(1,3,5,......)。很明显,a
,b
和c
都是无限的。
您可能期望a - a = 0
,这意味着infinity - infinity = 0
。但是,您也可以期待a - b = c
,因为c
是a
中的数字,不在b
中。但是,这给了我们infinity - infinity = infinity
。
通过正确构造无穷大,您可以生成任何整数作为infinity - infinity
的答案。因此,给它一个正确的定义是没有意义的,所以我们让它为NaN
或“不是数字”。
分裂也是如此,即第3点。
答案 1 :(得分:5)
checked
会解决这个问题; unchecked
是默认行为