Java Integer溢出,为什么要使用Integer.MAX_VALUE / 10?

时间:2019-06-05 21:52:29

标签: java integer overflow

这是Leetcode解决方案中的代码。所以我不明白if条件,为什么必须将Integer.MAX_VALUE除以10(Interger.MAX_VALUE / 10)?

谢谢!

class Solution {
    public int reverse(int x) {
        int rev = 0;
        while (x != 0) {
            int pop = x % 10;
            x /= 10;
            if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
            if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;
        }
        return rev;
    }
}


2 个答案:

答案 0 :(得分:0)

这很简单。它主要是为了避免整数内存超出绑定异常而添加的。

Line 1:   rev == Integer.MAX_VALUE / 10
Line 2:  rev = rev * 10 + pop;

让我们假设上述情况对于某些值是正确的。 Line 1 means that 10*rev = Integer.MAX_VALUE.第2行:rev是一个整数。如果按照第1行的规定,我们遇到了rev = Integer.MAX_VALUE,如果在其顶部添加一个pop的情况,则将遇到整数内存超出限制的异常。为了避免这种情况,添加了第1行。确保执行第1行的示例测试用例为"Pass Integer.MAX_VALUE" as an input to reverse() function.

答案 1 :(得分:0)

reverse(int x)函数将x的十进制数字反转。例如,如果x = 102返回201,如果x = -102返回-201

计算x的倒数时,它存储在rev中。例如,对于x = 102rev采用连续值220201

在每次迭代中,将rev乘以10,并向其添加一个数字。当然,rev不能大于Integer.MAX_VALUE2147483647)。因此,在将rev乘以10之前,我们检查是否将其乘以10并加上pop会使其大于Integer.MAX_VALUE

我们首先检查rev是否大于Integer.MAX_VALUE / 10214748364)。如果更大,则反向整数不存在。如果不是,则rev小于或等于Integer.MAX_VALUE / 10。如果它小于Integer.MAX_VALUE / 10,则即使我们将其乘以10,也可以在其中加上任何数字(pop,而不会超过Integer.MAX_VALUE。但是,如果它等于Integer.MAX_VALUE / 10,则必须确保pop不是> 72147483647 - 214748364 * 10),因为否则我们将超出Integer.MAX_VALUE

Integer.MIN_VALUE2147483648)同样适用。