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;

}

}

(可以替代intlong执行相同的检查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

回到顶部