Java 如何处理整数下溢和上溢?
在此基础上,您将如何检查/测试这种情况是否正在发生?
最佳答案
如果它溢出,它会返回到 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;
}
}
(您可以将 int
替换为 long
以对 long
执行相同的检查)
如果您认为这种情况可能经常发生,请考虑使用可以存储更大值的数据类型或对象,例如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
实用程序方法中。
关于java - Java 如何处理整数下溢和上溢,您将如何检查它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54473172/