これは、オーバーフローまたはアンダーフロー時に算術例外をスローする 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 。数値が反対の符号であることのテストはどのように役立ちますか?