为什么只有在 INT_MAX 加上 7 或更大时才会发生溢出?

我有 Leetcode 提供的解决方案,让我感到困惑的是,将 7(或更低的值)添加到 Integer.MAX_VALUE 或将 -8(或更低的值)添加到 Integer.MIN_VALUE 不会导致上溢或下溢分别。


我的逻辑是,如果你有 Integer.MAX_VALUE,加 1 会导致溢出。如果你有 Integer.MIN_VALUE,减 1 会导致下溢。我对上溢和下溢的理解哪里错了?


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;

    }

}


慕莱坞森
浏览 98回答 2
2回答

智慧大石

是的,通常加 1Integer.MAX_VALUE会导致溢出,从Integer.MIN_VALUE.&nbsp;但这不是这里发生的事情。此代码执行整数除以10,这会截断任何小数部分。将Integer.MAX_VALUE(&nbsp;2147483647) 除以 10 时,代码预期乘以 10 并添加下一个数字。该商是214748364,乘以10是2147483640,有可能再加上另一个 7 而不会溢出。同样在负数方面,将Integer.MAX_VALUE(&nbsp;-2147483648) 除以 10 产生-214748364,乘以 10 产生,有可能在不溢出的情况-2147483640下添加另一个。-8此代码考虑了值范围极值的最后一位,Integer并小心避免溢出。

拉丁的传说

Integer.MAX_VALUE是2147483647这意味着:Integer.MAX_VALUE/10是214748364你将要做:rev = rev * 10 + pop所以 if&nbsp;rev > 214748364, thenrev * 10会导致溢出。或者 if&nbsp;rev == 214748364, thenrev * 10是2147483640,并且rev * 10 + pop会导致溢出 if&nbsp;pop > 7。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java