Java如何处理整数下溢和上溢?
由此,您将如何检查/测试这种情况的发生?
如果溢出,它将返回最小值并从那里继续。如果下溢,它将返回最大值并从那里继续。
你可以按如下方式事先检查:
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)
int
long
如果你认为这种情况可能发生的次数更多,那么请考虑使用可以存储较大值(例如long或)的数据类型或对象java.math.BigInteger。最后一个不会溢出,实际上,可用的JVM内存是限制。
java.math.BigInteger
如果你碰巧已经在Java8上使用了,那么你可以使用new Math#addExact()和Math#subtractExact()方法,这将引发ArithmeticException溢出。
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实用程序方法中。