我想建立在 John Kugelman 的答案之上,而不是通过直接编辑来替换它。由于 的对称性,它适用于他的测试用例 ( MIN_VALUE = -10
, ) ,而二进制补码整数则不然。实际上,.MAX_VALUE = 10
MIN_VALUE == -MAX_VALUE
MIN_VALUE == -MAX_VALUE - 1
scala> (java.lang.Integer.MIN_VALUE, java.lang.Integer.MAX_VALUE)
res0: (Int, Int) = (-2147483648,2147483647)
scala> (java.lang.Long.MIN_VALUE, java.lang.Long.MAX_VALUE)
res1: (Long, Long) = (-9223372036854775808,9223372036854775807)
当应用于真MIN_VALUE
andMAX_VALUE
时,John Kugelman 的答案会产生一个溢出情况 whena == -1
和b ==
任何其他情况(Kyle 首先提出的观点)。这是修复它的方法:
long maximum = Long.signum(a) == Long.signum(b) ? Long.MAX_VALUE : Long.MIN_VALUE;
if ((a == -1 && b == Long.MIN_VALUE) ||
(a != -1 && a != 0 && ((b > 0 && b > maximum / a) ||
(b < 0 && b < maximum / a))))
{
// Overflow
}
它不是任何MIN_VALUE
and的通用解决方案MAX_VALUE
,但它对于 Java 的Long
andInteger
以及 and 的任何值都是通用a
的b
。