我很难找到一个由于大量正面整数大于Integer.MAX_VALUE而导致的错误。
我的问题是: 原因如下:
val a:Int = Integer.MAX_VALUE + 2
-> a = -2147483648
返回一个负数,而不是像执行:
val b:Int =999999999999999999
-> error: integer number too large
为什么不抛出标准的例外?
答案 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。
现在,为什么不会导致溢出异常?有两个原因:
异常本身是一个相对较新的概念,改变计算硬件世界使用的二进制系统为时已晚。
条件检查和抛出异常是一种具有性能成本的开销。如果我们想要高性能,通常不需要这些。如果没有对任何溢出异常进行显式检查,则会有性能提升。