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

(you can substitute 100 by 101 to perform the same checks for 101)

如果你认为这可能发生得更多,那么考虑使用一个可以存储较大值的数据类型或对象,例如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相关问答推荐

PDFBox SmallMap不尊重Map.入口哈希码合同

当在具有约束布局的AlertDialogue内部使用时,回收器视图布局宽度很奇怪

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

有关手动创建的包的问题

为什么在枚举中分支预测比函数调用快?

Java FX中的河内之塔游戏-在游戏完全解决之前什么都不会显示

Hibernate 6支持Joda DateTime吗?

当涉及到泛型时,类型推理在Java中是如何工作的?

如何在Java中从XML中获取特定的 node ,然后将其删除?

Helidon 4和Http API

JOOQ中的子查询使用的是默认方言,而不是配置的方言

如何使用log4j2(Json)记录由";异常引起的所有";?

为什么StandardOpenOption.CREATE不能通过Ubuntu在中小企业上运行?

从Spring6中的JPMS模块读取类时出现问题

如何生成指定范围内的11位序列号?

在java中使用不同的application.properties-jar而不使用Spring

在整数列表中查找和可被第三个整数整除的对时出现无法解释的RunTimeError

Android无法在Java代码中调用Kotlin代码,原因是在Companion中使用Kotlin枚举时

使用同步方法中的新线程调用同步方法

如何在MPAndroidChart中的条形图上正确添加标签