c# - .NET 基本类型添加怪癖?

标签 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/Infinity = 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 之类的操作。因此,添加超出 double 的 MaxValue 是可能的(可能会失去精度?),但在一些未知数字(可能可以计算出来 - 或者已经计算出来)之后,它失去了显示有效数字并返回 Infininty 的能力?

好吧,剩下的有点重复了。我只是想知道为什么这些以他们的方式运作?特别是 Double 运算符。能够添加到 MaxValue 之外对我来说是非常意外的。

最佳答案

  1. 是的; checked 会解决这个问题; unchecked 是默认行为
  2. 从数学上讲,您不能将 +inf 和 -inf 相加,也无法推断出一个符号。 NaN 是唯一明智的选择;然而,+inf++inf => +inf,和 -inf + -inf => -inf,就像你可能推断的那样
  3. 同样,从数学上讲,第一项是可行的。尤其是,它会导致 2*x/x=>1,这会更糟。但基本上:inf 不是数字
  4. 不,他们没有;这是 float 的预期行为
  5. float 不换行; 超过最大值就是无穷大

关于c# - .NET 基本类型添加怪癖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6683146/

相关文章:

css - 图像溢出到下一行

c# - MongoDB:在 C# 驱动程序中构建查询

c# - SQL DB 中的 Asp.net session 变量

c# - 上限双两位数点后

c++ - 查找 double * 数组的大小 C++

android - 如何管理在 GCM 服务器端的多播消息服务中添加注册 ID?

css - 简单的 flex 盒网格溢出适合行高

c - C代码-malloc和免费

c# - DotNetOpenAuth Twitter 身份验证返回 401 未经授权

c# - Razor 语法/WebMatrix - C# 问题