Я шел через Apache, общие математические LIBS Linkобнаружения переполнения при вычитании 2 лонги
В приведенном ниже фрагменте кода линий A, B, C не имеет смысла для меня. Может кто-то пролить свет на это?
public static long subAndCheck(long a, long b) throws MathArithmeticException {
long ret;
if (b == Long.MIN_VALUE) { ----------A
if (a < 0) { --------------------B
ret = a - b; ----------------C
} else {
throw new MathArithmeticException(LocalizedFormats.OVERFLOW_IN_ADDITION, a, -b);
}
} else {
// use additive inverse
ret = addAndCheck(a, -b, LocalizedFormats.OVERFLOW_IN_ADDITION);
}
return ret;
}
private static long addAndCheck(long a, long b, Localizable pattern) throws MathArithmeticException {
final long result = a + b;
if (!((a^b) < 0 || (a^result) >= 0)) {
throw new MathArithmeticException(pattern, a, b);
}
return result;
}
Проверьте это http://stackoverflow.com/questions/3001836/how-does-java-handle-integer-underflow-and-overflows-and-how-would-you-check-fo#3001879 –