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。
现在,为什么不会导致溢出异常?两个原因:
异常本身是一个相对较新的概念,更改计算硬件世界使用的二进制系统为时已晚。
条件检查和抛出异常是一种具有性能成本的开销。如果我们想要高性能,这些通常是不必要的。如果没有对任何溢出异常进行显式检查,则会提高性能。
添加检查会降低性能,一些代码可能依赖于溢出的工作方式。
如果不想溢出Java8有解决办法:
Math.addExact(left, right);
https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#addExact-int-int-
我很难找到一个错误,该错误是由于大量正整数大于 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。
现在,为什么不会导致溢出异常?两个原因:
异常本身是一个相对较新的概念,更改计算硬件世界使用的二进制系统为时已晚。
条件检查和抛出异常是一种具有性能成本的开销。如果我们想要高性能,这些通常是不必要的。如果没有对任何溢出异常进行显式检查,则会提高性能。
添加检查会降低性能,一些代码可能依赖于溢出的工作方式。
如果不想溢出Java8有解决办法:
Math.addExact(left, right);
https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#addExact-int-int-