Scala - 积极的Int为负数 - 溢出异常?

时间:2015-07-08 10:52:18

标签: scala exception integer overflow

我很难找到一个由于大量正面整数大于Integer.MAX_VALUE而导致的错误。

我的问题是: 原因如下:

val a:Int = Integer.MAX_VALUE + 2

-> a = -2147483648返回一个负数,而不是像执行:

那样发出溢出异常
val b:Int =999999999999999999

-> error: integer number too large

为什么不抛出标准的例外?

2 个答案:

答案 0 :(得分:3)

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

如果你不想要溢出,Java 8有一个解决方案:

Math.addExact(left, right);

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

答案 1 :(得分:2)

简短回答:表现。

答案很长:

基本"二进制"系统内置任何内容来表示负数,它只包含0和1。问题是:我们如何仅使用0和1代表负数?

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

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

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

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