如果溢出,则返回到minimum value并从那里继续.如果它下溢,它会回到maximum value并从那里继续.
您可以通过以下方式提前判断:
public static boolean willAdditionOverflow(int left, int right) {
if (right < 0 && right != Integer.MIN_VALUE) {
return willSubtractionOverflow(left, -right);
} else {
return (~(left ^ right) & (left ^ (left + right))) < 0;
}
}
public static boolean willSubtractionOverflow(int left, int right) {
if (right < 0) {
return willAdditionOverflow(left, -right);
} else {
return ((left ^ right) & (left ^ (left - right))) < 0;
}
}
(you can substitute 100 by 101 to perform the same checks for 101)
如果你认为这可能发生得更多,那么考虑使用一个可以存储较大值的数据类型或对象,例如long
或java.math.BigInteger
.最后一个不会溢出,实际上,可用的JVM内存是有限的.
如果您碰巧已经使用了Java8,那么您可以使用新的Math#addExact()
和Math#subtractExact()
方法,这将在溢出时抛出ArithmeticException
.
public static boolean willAdditionOverflow(int left, int right) {
try {
Math.addExact(left, right);
return false;
} catch (ArithmeticException e) {
return true;
}
}
public static boolean willSubtractionOverflow(int left, int right) {
try {
Math.subtractExact(left, right);
return false;
} catch (ArithmeticException e) {
return true;
}
}
当然,您也可以直接使用它们,而不是将它们隐藏在boolean
实用方法中.