. net基本类型的加法

本文关键字:类型 net | 更新日期: 2023-09-27 18:02:13

我很好奇,所以我运行了几个测试,看看。net如何处理溢出(我找不到任何文档)。我几乎希望他们吐出溢出错误,而不是结果,因为老实说,这些结果只是奇怪:

  1. Int32.MaxValue + Int32.MaxValue = -2
    我理解它环绕,但为什么这样做,而不是抛出一个OverflowException?这不是"未检查"的意思吗?忽略溢出?我有点困惑,什么是unchecked现在,特别是因为我看到它用于创建哈希值。

  2. Double.PositiveInfinity + Double.NegativeInfinity = Double.NaN
    另外一个奇怪的地方。1 + -1 = 0。100 + -100 = 0。为什么∞+ -∞= 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,但也不环绕?所以我猜不是所有的基本类型都像整型那样。奇怪的是,我可以做像Double.MaxValue + 1 = 1.79769313486232E+308这样的事情。所以在双精度对象的MaxValue之外添加是可能的(可能会失去精度?),但是在一些未知的数字之后(它可能已经被计算出来了-或者已经被计算出来了),它失去了显示有效数字的能力并返回无穷大?

好吧,剩下的都是重复的。我只是想知道为什么这些东西会这样?尤其是双操作符。对于我来说,能够添加超出MaxValue的内容是非常出乎意料的。

. net基本类型的加法

  1. 是的;checked将解决这个问题;unchecked是默认行为
  2. 数学上,你不能加+inf和-inf,你不能推断一个符号。NaN是唯一相同的选择;但是,+inf +inf => +inf和-inf + -inf => -inf,就像您可能推断的
  3. 再一次,在数学上这首先是可行的。至少,它会导致2*x/x=>1,这将更糟糕。但基本上:inf不是一个数字
  4. 不,他们没有;这是浮点
  5. 的预期行为。
  6. Float不换行;超过最大值是无穷大

约2/3

无穷大不是一个数字。它也不像一个数字。

a为正整数(1,2,3,…)的个数,b为偶整数(2,4,6,…)的个数,c为奇数(1,3,5,…)的个数。很明显,a, bc都是无穷大的。

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

通过正确构造你的无穷,你可以得到任何整数作为infinity - infinity的答案。因此,给它一个合适的定义是没有意义的,所以我们让它是NaN,或"Not a Number"。

除法也是一样,也就是第3点