google 番石榴库中的溢出条件
Condition for overflow in google guava library
这是 LongMath.checkedAdd() 方法的代码,它在上溢或下溢时抛出算术异常。
public static long checkedAdd(long a, long b) {
long result = a + b;
checkNoOverflow((a ^ b) < 0 | (a ^ result) >= 0);
return result;
}
static void checkNoOverflow(boolean condition) {
if (!condition) {
throw new ArithmeticException("overflow");
}
}
我明白为什么这个 API 正在测试 (a ^ result) 但我不明白为什么要包括这个条件:(a ^ b) < 0 。测试数字符号相反有什么帮助?
正如 GregS 所写,如果 a
和 b
的符号相反 (*),则它们相加不可能溢出。现在,如果它们具有相同的符号,则如果有 mo 溢出,结果的符号必须相同。
(*) 零和正数被同等对待,这无关紧要并使条件变得简单。
这是 LongMath.checkedAdd() 方法的代码,它在上溢或下溢时抛出算术异常。
public static long checkedAdd(long a, long b) {
long result = a + b;
checkNoOverflow((a ^ b) < 0 | (a ^ result) >= 0);
return result;
}
static void checkNoOverflow(boolean condition) {
if (!condition) {
throw new ArithmeticException("overflow");
}
}
我明白为什么这个 API 正在测试 (a ^ result) 但我不明白为什么要包括这个条件:(a ^ b) < 0 。测试数字符号相反有什么帮助?
正如 GregS 所写,如果 a
和 b
的符号相反 (*),则它们相加不可能溢出。现在,如果它们具有相同的符号,则如果有 mo 溢出,结果的符号必须相同。
(*) 零和正数被同等对待,这无关紧要并使条件变得简单。