How does Java handle integer underflows and overflows and how would you check for it?(Java 如何处理整数下溢和上溢以及如何检查它?)
问题描述
Java 如何处理整数下溢和上溢?
How does Java handle integer underflows and overflows?
在此基础上,您将如何检查/测试这种情况是否正在发生?
Leading on from that, how would you check/test that this is occurring?
推荐答案
如果溢出,返回到最小值 并从那里继续.如果下溢,则返回 最大值 并从那里继续.
If it overflows, it goes back to the minimum value and continues from there. If it underflows, it goes back to the maximum value and continues from there.
您可以按如下方式预先检查:
You can check that beforehand as follows:
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
执行相同的检查)
(you can substitute int
by long
to perform the same checks for long
)
如果您认为这种情况可能经常发生,请考虑使用可以存储更大值的数据类型或对象,例如long
或者 java.math.BigInteger
.最后一个不溢出,实际可用的JVM内存就是极限了.
If you think that this may occur more than often, then consider using a datatype or object which can store larger values, e.g. long
or maybe java.math.BigInteger
. The last one doesn't overflow, practically, the available JVM memory is the limit.
如果您碰巧已经在使用 Java8,那么您可以使用新的 Math#addExact()
和 Math#subtractExact()
方法会抛出 ArithmeticException
溢出.
If you happen to be on Java8 already, then you can make use of the new Math#addExact()
and Math#subtractExact()
methods which will throw an ArithmeticException
on overflow.
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;
}
}
源码可以找到这里 和 这里分别.
The source code can be found here and here respectively.
当然,您也可以直接使用它们,而不是将它们隐藏在 boolean
实用程序方法中.
Of course, you could also just use them right away instead of hiding them in a boolean
utility method.
这篇关于Java 如何处理整数下溢和上溢以及如何检查它?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Java 如何处理整数下溢和上溢以及如何检查它?


基础教程推荐
- 如何在 JFrame 中覆盖 windowsClosing 事件 2022-01-01
- Java Swing计时器未清除 2022-01-01
- 大摇大摆的枚举 2022-01-01
- 验证是否调用了所有 getter 方法 2022-01-01
- 如何在 Spring @Value 注解中正确指定默认值? 2022-01-01
- Java 实例变量在两个语句中声明和初始化 2022-01-01
- 从 python 访问 JVM 2022-01-01
- 在 Java 中创建日期的正确方法是什么? 2022-01-01
- 不推荐使用 Api 注释的描述 2022-01-01
- 多个组件的复杂布局 2022-01-01