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 > 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.
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