反转负数需先提取符号再处理绝对值,用long long避免abs(int_min)溢出;每步检查rev是否超过int_max/10或等于时个位超7;int_min反转必溢出,应直接返回0。

反转 int 时负号怎么处理
直接对负数取反再反转,容易把负号丢在末尾变成 -123 → 321- 这种非法数字。C++ 的 int 类型不支持末尾符号,所以必须先提取符号、再对绝对值操作。
- 用
std::abs(x)获取绝对值,但注意:当x == INT_MIN时,std::abs(INT_MIN)会溢出(因为INT_MAX比-INT_MIN小 1),这是最隐蔽的坑 - 稳妥做法是用
long long中转:先转成long long abs_val = x - 反转完成后,再根据原符号加回负号,而不是拼字符串
用除 10 取余法反转比转字符串快
转成 std::string 再 std::reverse 看似简单,但涉及内存分配、字符转换、额外拷贝,对纯数值操作属于杀鸡用牛刀。除 10 法逻辑清晰、无堆分配、可 inline 优化。
- 核心循环:
while (n > 0) { rev = rev * 10 + n % 10; n /= 10; } - 每轮必须检查溢出:比如
rev > INT_MAX / 10或rev == INT_MAX / 10 && n % 10 > 7(因INT_MAX % 10 == 7) - 别忘了处理
n == 0的边界:单独返回 0,否则循环不进
INT_MIN 反转一定会溢出
INT_MIN 是 -2147483648,反转后是 -8463847412,远超 int 范围。C++ 标准规定有符号整数溢出是未定义行为(UB),不是抛异常,也不是截断——编译器可能直接优化掉判断逻辑。
- 不能依赖运行时异常捕获;必须在反转前静态判断:
if (x == INT_MIN) return 0; - 有些题库(如 LeetCode)明确要求溢出时返回 0,这是约定,不是 bug
- 如果函数签名允许,改用
long long返回更安全,但要注意调用方是否兼容
用 std::reverse 需要先转 string,但要注意前导零
比如输入 100,转成 "100" 再 std::reverse 得到 "001",再转回 int 是 1 —— 这其实是正确结果,但容易误以为逻辑错了。
立即学习“C++免费学习笔记(深入)”;
- 代码片段:
std::string s = std::to_string(std::abs(x)); std::reverse(s.begin(), s.end()); int rev = std::stoi(s); if (x -
std::stoi自动跳过前导零,所以不用手动 trim - 但
std::stoi遇到溢出会抛std::out_of_range,需try/catch,而除 10 法可主动控制
事情说清了就结束










