我想以约翰·库格曼(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
和MAX_VALUE
约翰Kugelman的回答时,产生溢出的情况下a == -1
和b ==
别的(点由凯尔首次提出)。这是一种解决方法:
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
和MAX_VALUE
,但它一般用于Java的Long
和Integer
和的任意值a
和b
。