一尘不染

Java如何处理整数下溢和溢出,以及如何检查它?

java

Java如何处理整数下溢和上溢?

由此,您将如何检查/测试这种情况的发生?


阅读 792

收藏
2020-02-25

共1个答案

一尘不染

如果溢出,它将返回最小值并从那里继续。如果下溢,它将返回最大值并从那里继续。

你可以按如下方式事先检查:

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实用程序方法中。

2020-02-25