java - Java 如何处理整数下溢和上溢,您将如何检查它?

标签 java integer integer-overflow

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 执行相同的检查)

如果您认为这种情况可能经常发生,请考虑使用可以存储更大值的数据类型或对象,例如longjava.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/54473172/

相关文章:

java - 如何限制图例大小并使其可以用饼图滚动?和 javafx 布局

C变量混淆

c - 为什么 x - y 在这个函数中不会溢出 TMin?为什么在这种情况下功能错误?

node.js - async_ids有可能溢出吗?

java - H2 嵌入式数据库外键和引用

java - 访问同一类中的 diff 方法中的值

integer - 如何关闭整数溢出保护?

C++:像 PHP 一样将大量数字存储在 float 中?

c - 快速排序示例(K&R C 书)中的错误?

java - Swing 电子邮件客户端抛出 javax.mail.AuthenticationFailedException