假设我有:
int result = value1 * value2;
boolean isOverflow = ?
如何以高效的方式检查溢出?我找到了这个解决方案,但它似乎相当昂贵。我也注意到了另一个 SO question,但没有可用的答案......
更新:无法保证这些值是正数还是负数。
假设我有:
int result = value1 * value2;
boolean isOverflow = ?
如何以高效的方式检查溢出?我找到了这个解决方案,但它似乎相当昂贵。我也注意到了另一个 SO question,但没有可用的答案......
更新:无法保证这些值是正数还是负数。
您可以使用包中类中checkedMultiply
提供的内容。有关信息,请查看java 文档。LongMath
com.google.common.math
或者
类中的Java 8
multiplyExact
方法Math
。对于 java 文档,请单击此处。
或者
您可以通过以下方式检查溢出 -
long overflowCheck;
if(Math.sign(value1) == Math.sign(value2)) {
overflowCheck = Long.MAX_VALUE
} else {
overflowCheck = Long.MIN_VALUE;
}
if (value1 != 0 && (value2 > 0 && value2 > overflowCheck / value1 ||
value2 < 0 && value2 < overflowCheck / value1))
{
isOverflow = true;
}
好消息是,在新的 JDK 8 中,Math 类中将有一些方法可以执行引发溢出异常的操作。
例如,发生溢出时,新的Math.multiplyExact方法会引发 ArithmeticException。如果您使用的是以前版本的 Java,那么可能一个好方法是复制这个确切的实现,这样,当您升级到 JDK 8 时,您所要做的就是使用新的 JDK 实现为方法。
JDK 8 中的当前实现如下:
/**
* Returns the product of the arguments,
* throwing an exception if the result overflows an {@code int}.
*
* @param x the first value
* @param y the second value
* @return the result
* @throws ArithmeticException if the result overflows an int
* @since 1.8
*/
public static int multiplyExact(int x, int y) {
long r = (long)x * (long)y;
if ((int)r != r) {
throw new ArithmeticException("long overflow");
}
return (int)r;
}