You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决32位带符号整数反转程序的溢出错误?

问题分析与修复方案

你的代码核心问题有两个:

  1. 溢出判断逻辑完全错误:rev <= 10000000这个条件没有任何依据,完全起不到检测溢出的作用。
  2. 溢出后才判断,为时已晚:当反转后的数值超过int范围时,int类型会发生整数溢出回绕(比如输入2147483647,反转过程中rev会超过2147483647,直接变成负数),这时候再判断已经没用了。

正确的修复思路

带符号32位int的范围是[-2147483648, 2147483647],我们需要在每一步计算反转值之前判断是否会溢出:

  • 对于正数反转:如果当前rev大于Integer.MAX_VALUE /10,那么rev*10肯定超过最大值;如果rev等于Integer.MAX_VALUE /10,则最后一位d不能超过7(因为2147483647的最后一位是7)。
  • 对于负数反转:如果当前rev小于Integer.MIN_VALUE /10,那么rev*10肯定小于最小值;如果rev等于Integer.MIN_VALUE /10,则最后一位d不能小于-8(因为-2147483648的最后一位是-8)。

修正后的代码

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

代码解释

  • 每次循环先取出当前x的最后一位d。
  • 先检查下一步计算rev*10 +d是否会超出int范围,一旦触发溢出条件直接返回0。
  • 没有溢出的情况下,再更新rev和x,继续循环。

这样处理后,输入2147483647时,在反转过程中会触发溢出判断,直接返回0,符合预期。

内容的提问来源于stack exchange,提问作者Kajal Dey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:05:13