After solving some C++ problems from LeetCode I came across to the Reverse Integer and realized I can not really grasp how to deal with integer overflow.
The problem is simple and consists in reversing an integer number (e.g. 123 -> 321). Now, the difficult part is complying with the following limitation:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows
What I did was the following:
int reverse(int x) {
int temp = 0;
while(x != 0){
// pop
int pop = x%10;
x /= 10;
if(temp < (INT_MIN - pop)/10 || temp > (INT_MAX - pop)/10){
return 0;
}
else{
// push
temp = temp*10 + pop;
}
}
return temp;
}
Unfortunately, the code does not prevent the overflow. What am I doing wrong?
An integer overflow can cause the value to wrap and become negative, which violates the program's assumption and may lead to unexpected behavior (for example, 8-bit integer addition of 127 + 1 results in −128, a two's complement of 128).
Write a “C” function, int addOvf(int* result, int a, int b) If there is no overflow, the function places the resultant = sum a+b in “result” and returns 0. Otherwise it returns -1. The solution of casting to long and adding to find detecting the overflow is not allowed.
In languages where integer overflow can occur, you can reduce its likelihood by using larger integer types, like Java's long or C's long long int. If you need to store something even bigger, there are libraries built to handle arbitrarily large numbers.
For example, if an integer data type allows integers up to two bytes or 16 bits in length (or an unsigned number up to decimal 65,535), and two integers are to be added together that will exceed the value of 65,535, the result will be 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).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With