1

这是 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 。测试这些数字是否具有相反的符号有什么帮助?

4

1 回答 1

1

正如 GregS 所写,如果ab是相反的符号(*),那么它们的加法不可能溢出。现在,如果它们的符号相同,那么如果 mo 溢出,结果的符号必须相同。


(*) 零和正数相同,这无关紧要并使条件简单。

于 2015-01-10T19:28:06.220 回答