如何在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
相关产品推荐
相关产品推荐

