gpt4 book ai didi

java - Java 如何处理整数下溢和上溢以及如何检查它?

转载 作者:IT老高 更新时间:2023-10-28 12:16:37 28 4
gpt4 key购买 nike

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;
}
}

源代码可见herehere分别。

当然,您也可以直接使用它们,而不是将它们隐藏在 boolean 实用程序方法中。

关于java - Java 如何处理整数下溢和上溢以及如何检查它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3001836/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com