Java如何处理整数下溢和溢出,以及如何检查它?
Java如何处理整数下溢和上溢?
由此,您将如何检查/测试这种情况的发生?
回答:
如果溢出,它将返回最小值并从那里继续。如果下溢,它将返回最大值并从那里继续。
你可以按如下方式事先检查:
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;
}
}
(可以替代int
由long
执行相同的检查long
)
如果你认为这种情况可能发生的次数更多,那么请考虑使用可以存储较大值(例如long或)的数据类型或对象java.math.BigInteger
。最后一个不会溢出,实际上,可用的JVM内存是限制。
如果你碰巧已经在Java8上使用了,那么你可以使用new 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实用程序方法中。
以上是 Java如何处理整数下溢和溢出,以及如何检查它? 的全部内容, 来源链接: utcz.com/qa/428559.html