Scala - 正 Ints 的总和为负 - 溢出异常?

Scala - Sum of positive Ints being negative - Overflow Exception?

我很难找到一个错误,该错误是由于大量正整数大于 Integer.MAX_VALUE 而引起的。

我的问题是: 为什么:

val a:Int = Integer.MAX_VALUE + 2

-> a = -2147483648 returns 一个负数,而不是像这样给出溢出异常:

val b:Int =999999999999999999

-> error: integer number too large

为什么抛出异常不是标准?

简答:性能。

长答案:

基本的 "binary" 系统没有内置任何东西来表示负数,它仅由 0 和 1 组成。问题是:我们如何仅使用 0 和 1 来表示负数?

标准答案是使用补码格式。一个 3 位二进制系统的简单示例:000 表示 0,011 表示 3,111 表示 -1(当您从 0 减去 1 时,您想要 -1 是有意义的),100 表示 -3。如果将 1 加到 011 或 3,将得到 111 或 -3。

现在,为什么不会导致溢出异常?两个原因:

  1. 异常本身是一个相对较新的概念,更改计算硬件世界使用的二进制系统为时已晚。

  2. 条件检查和抛出异常是一种具有性能成本的开销。如果我们想要高性能,这些通常是不必要的。如果没有对任何溢出异常进行显式检查,则会提高性能。

添加检查会降低性能,一些代码可能依赖于溢出的工作方式。

如果不想溢出Java8有解决办法:

Math.addExact(left, right);

https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#addExact-int-int-