为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕莱坞森 2022-11-02 16:44:33
我有 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;    }}
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

是的,通常加 1Integer.MAX_VALUE会导致溢出,从Integer.MIN_VALUE. 但这不是这里发生的事情。

此代码执行整数除以10,这会截断任何小数部分。将Integer.MAX_VALUE2147483647) 除以 10 时,代码预期乘以 10 并添加下一个数字。该商是214748364,乘以102147483640,有可能再加上另一个 7 而不会溢出。同样在负数方面,将Integer.MAX_VALUE-2147483648) 除以 10 产生-214748364,乘以 10 产生,有可能在不溢出的情况-2147483640下添加另一个。-8

此代码考虑了值范围极值的最后一位,Integer并小心避免溢出。


查看完整回答
反对 回复 2022-11-02
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

Integer.MAX_VALUE2147483647

这意味着:Integer.MAX_VALUE/10214748364

你将要做:rev = rev * 10 + pop

所以 if rev > 214748364, thenrev * 10会导致溢出。

或者 if rev == 214748364, thenrev * 102147483640,并且rev * 10 + pop会导致溢出 if pop > 7


查看完整回答
反对 回复 2022-11-02
  • 2 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号