【发布时间】:2011-10-04 17:14:12
【问题描述】:
我很好奇,所以我运行了几个测试来看看 .NET 如何处理溢出(我在任何地方都找不到它的文档)。我几乎希望他们吐出溢出错误而不是结果,因为老实说这些结果很奇怪:
Int32.MaxValue + Int32.MaxValue = -2
我知道它会环绕,但为什么要这样做而不是抛出 OverflowException?这不是“未经检查”的目的......忽略溢出吗?我现在对 unchecked 是什么感到有点困惑,特别是因为我已经看到它用于创建哈希值。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 / Infinity = 0 的限制)。事实上...Double.MaxValue / Double.PositiveInfinity = 0...Double.PositiveInfinity / 0 = Infinity
什么!?没有 DivideByZeroException!?Double.MaxValue + Double.MaxValue = Infinity
是的,这个不会抛出溢出异常,但也不会环绕?所以我猜不是所有原始类型的行为都像 int 那样。奇怪的是,我可以做诸如Double.MaxValue + 1 = 1.79769313486232E+308之类的事情。因此,添加超出双精度的 MaxValue 是可能的(可能会失去精度?),但是在一些未知数之后(可能可以算出 - 或已经算出)它失去了显示有效数字并返回 Infininty 的能力?
嗯,其余的有点重复。我只是想知道为什么这些以他们的方式运作?特别是 Double 运算符。能够添加超出 MaxValue 对我来说是非常意外的。
【问题讨论】:
-
#1 由项目属性 -> 构建 -> 高级... -> 检查算术上溢/下溢中的构建设置控制。使用 Checked/Unchecked 只是覆盖此设置以说“始终检查/不检查此代码是否有溢出/下溢”。
-
@Adam 和选中/未选中的关键字,用于更本地化的使用
标签: c# double overflow int primitive