.NET原始类型除了古怪?

时间:2011-07-13 17:38:42

标签: c# double overflow int primitive

我很好奇,所以我运行了几个测试来看看.NET如何处理溢出(我无法在任何地方找到它)。我几乎希望他们吐出溢出错误而不是结果,因为老实说这些结果只是奇怪的:

  1. Int32.MaxValue + Int32.MaxValue = -2
    我知道它包装,但为什么这样做而不是抛出OverflowException?是不是“未经检查”是为了​​......忽略溢出?我对于现在未经检查的内容感到困惑,特别是因为我已经看到它用于创建哈希值。

  2. Double.PositiveInfinity + Double.NegativeInfinity = Double.NaN
    另一个奇怪的是。 1 + -1 = 0. 100 + -100 = 0.那么为什么Infinity + -Infinity = NaN?

  3. Double.PositiveInfinity / Double.PositiveInfinity = Double.NaN
    再次,为什么奇怪?我想这应该是1或者可能是0(b / c的极限x /无穷大= 0)。事实上...... Double.MaxValue / Double.PositiveInfinity = 0 ...

  4. Double.PositiveInfinity / 0 = Infinity
    什么!?没有DivideByZeroException!?

  5. Double.MaxValue + Double.MaxValue = Infinity
    是的,这个没有抛出OverflowException,但也没有环绕?所以我猜不是所有的原始类型都像int那样。奇怪的是,我可以做Double.MaxValue + 1 = 1.79769313486232E+308之类的事情。因此,添加超出双倍的MaxValue是可能的(可能会失去精度?),但是在一些未知数字(它可能已被弄清楚 - 或已经存在)之后,它会失去显示有效数字并返回Infininty的能力?

  6. 好吧,其余的都是重复的。我只是想知道为什么这些按照他们的方式运作?特别是Double运营商。对于我来说,能够超越MaxValue是非常意外的。

2 个答案:

答案 0 :(得分:5)

约2/3

无限不是一个数字。它也不像数字。

如果我们让a为正整数(1,2,3,...),b是偶数的整数(2,4,6,... ),c是奇数的整数(1,3,5,......)。很明显,abc都是无限的。

您可能期望a - a = 0,这意味着infinity - infinity = 0。但是,您也可以期待a - b = c,因为ca中的数字,不在b中。但是,这给了我们infinity - infinity = infinity

通过正确构造无穷大,您可以生成任何整数作为infinity - infinity的答案。因此,给它一个正确的定义是没有意义的,所以我们让它为NaN或“不是数字”。

分裂也是如此,即第3点。

答案 1 :(得分:5)

  1. 是; checked会解决这个问题; unchecked是默认行为
  2. 在数学上,您无法添加+ inf和-inf,也无法推断出符号。 NaN是唯一理智的选择;但是,+ inf + + inf => + inf,和-inf + -inf => -inf,就像你可能会推断一样
  3. 再次,数学上第一次工作。尤其是,它会导致2 * x / x => 1,这会更糟。但基本上:inf不是数字
  4. 不,他们没有;这是浮点的预期行为
  5. Float不包裹; 超过最大值是无穷大