亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么只有在 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 關注
  • 123 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號