如何解决32位带符号整数反转程序的溢出错误?
问题分析与修复方案
你的代码核心问题有两个:
- 溢出判断逻辑完全错误:
rev <= 10000000这个条件没有任何依据,完全起不到检测溢出的作用。 - 溢出后才判断,为时已晚:当反转后的数值超过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
相关产品推荐
相关产品推荐

