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

如何在C++中获取最小负int值的正值(不使用库函数)

解决int最小值取正的溢出问题

当int类型变量为最小值-2147483648时,直接执行-1 * n会触发有符号整数溢出,这属于C++中的未定义行为。不用库函数也不用硬编码判断极值的话,可通过以下两种方式解决:

方法一:利用更大范围的有符号整数类型

将int转换为long long(取值范围远大于int)后再取反,从根源避免溢出:

// 若需将结果存回int,注意:2147483648超出int范围,存回会触发实现定义行为
if (n < 0) {
    n = static_cast<int>(-static_cast<long long>(n));
}

// 更合理的做法:用long long存储正值,确保能容纳2147483648
long long positive_val;
if (n < 0) {
    positive_val = -static_cast<long long>(n);
} else {
    positive_val = n;
}

方法二:利用无符号整数的特性

无符号整数的溢出是定义良好的(按模2^N处理),将int转换为unsigned int后取反,再转回int:

if (n < 0) {
    n = static_cast<int>(-static_cast<unsigned int>(n));
}

原理说明

  • long long的常规取值范围是-9223372036854775808到9223372036854775807,完全能容纳int最小值取正后的2147483648,不会触发溢出。
  • 无符号整数取负时会自动按模2^32(假设int为32位)计算,unsigned int类型的-2147483648会被转换为2147483648;转回int时虽超出有符号范围,但多数编译器会保留对应二进制值(此为实现定义行为,更推荐用long long存储结果)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 12:37:27