assuming cyclic overflows, i.e. INTMAX + 1 = INTMIN:
if INTMAX - y < x (equivalent to x + y > INTMAX without cycles)
then x + y = INTMIN + y - (INTMAX - x - 1)
ergo, rewriting the equations as x' = x + y y' = x' - y x'' = x' - y'
we get: x' = INTMIN + y - (INTMAX - x - 1) y' = x' - y y' = INTMIN - (INTMAX - x - 1) y' = INTMIN + 1 - INTMAX + x y' = x x'' = INTMIN + y - (INTMAX - x - 1) - y' x'' = INTMIN + y - (INTMAX - x - 1) - x x'' = INTMIN + y - INTMAX + x + 1 - x x'' = INTMIN + 1 + y - INTMAX x'' = y
Overflows schmoverflows.
EDIT: Might be worth noting that this approach and the bitwise operator are essentially the same thing. Combine two things in a way that is reversible if you have either of the two originals.
assuming cyclic overflows, i.e. INTMAX + 1 = INTMIN:
if
INTMAX - y < x(equivalent tox + y > INTMAXwithout cycles)then
x + y = INTMIN + y - (INTMAX - x - 1)ergo, rewriting the equations as
x' = x + yy' = x' - yx'' = x' - y'we get:
x' = INTMIN + y - (INTMAX - x - 1)y' = x' - yy' = INTMIN - (INTMAX - x - 1)y' = INTMIN + 1 - INTMAX + xy' = xx'' = INTMIN + y - (INTMAX - x - 1) - y'x'' = INTMIN + y - (INTMAX - x - 1) - xx'' = INTMIN + y - INTMAX + x + 1 - xx'' = INTMIN + 1 + y - INTMAXx'' = yOverflows schmoverflows.
EDIT: Might be worth noting that this approach and the bitwise operator are essentially the same thing. Combine two things in a way that is reversible if you have either of the two originals.
Unfortunately that works in theory but in practice and most compilers do not guarantee that behavior. For example:
Java: Will back cycle to -2147483648
Javascript: will eventually print infinity if the value is too high
Go: Will not compile