C++ understanding integer overflow
The sign of pop
is implementation-defined (before C++11), and INT_MIN - pop
will cause an overflow if it is negative. So let's first reduce the problem to positive integers only:
if (x == INT_MIN) // INT_MIN cannot be inverted, handle it separately
return 0;
const int sign = (x < 0) ? -1 : 1;
x *= sign;
The overflow condition is:
10 * temp + pop > INT_MAX
After simple math, we get:
temp > (INT_MAX - pop) / 10
Here pop
is always non-negative, so INT_MAX - pop
cannot overflow. The final result is sign * temp
. Because temp
is positive, -temp
cannot overflow (it could overflow if temp
were negative).