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

如何控制long到int的隐式转换:32位有符号整数反转问题排查

LeetCode 整数反转问题代码bug排查

核心问题点

  • 32位有符号整数边界溢出
    32位有符号int的取值范围是[-2147483648, 2147483647],你代码中执行a = abs(x)时,若输入x为-2147483648,abs返回的正数结果超出了int的最大正值2147483647,属于C++未定义行为,多数编译器下a最终会被赋值为-2147483648而非预期的正数值。
  • 负数取模拼接字符串逻辑异常
    因为a此时是负数,循环中r = a%10得到的结果也是负数,转为字符串后会带上负号,拼接后的字符串形如-8-4-6-3...,stoi解析这类多负号的字符串时,只会取第一个负号和其后连续的数字,后续字符直接截断,所以循环全程y的值都为-8,不会触发越界异常。
  • 负返回值未做越界校验
    你仅在拼接正数字符串时捕获了stoi的越界异常,最终返回-y时没有判断结果是否低于32位int的最小边界,即使y本身合法,-y也可能出现溢出。

修复建议

  1. 先将输入x转为long long类型后再取绝对值,避免初始abs操作的溢出:
long long a = llabs((long long)x);
  1. 建议替换字符串拼接的方案,直接用数学计算判断越界,性能更高且逻辑更清晰,示例逻辑:
#include<iostream>
#include<limits>
using namespace std;

class Solution {
public:
    int reverse(int x) {
        int res = 0;
        while (x != 0) {
            int tmp = x % 10;
            // 提前判断正向越界
            if (res > INT_MAX / 10 || (res == INT_MAX / 10 && tmp > 7)) return 0;
            // 提前判断负向越界
            if (res < INT_MIN / 10 || (res == INT_MIN / 10 && tmp < -8)) return 0;
            res = res * 10 + tmp;
            x /= 10;
        }
        return res;
    }
};

int main(){
    Solution mine;
    cout << mine.reverse(-2147483648);
}

内容的提问来源于stack exchange,提问作者Armen Haddad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:15:03