对int求绝对值应直接用abs(-42)得42(int),避免fabs或std::abs引发隐式转换、重载歧义及int_min未定义行为。

用 abs 求 int 的绝对值最直接
对 int 类型,直接调 abs 就行,不用额外头文件(C++ 标准保证 <cstdlib></cstdlib> 或 <cmath></cmath> 会透出它,但显式包含更稳妥)。abs 是整数专用,返回 int,类型匹配、无隐式转换风险。
- 写法:
abs(-42)→ 返回42(int) - 别用
std::abs不加using或作用域限定——可能因重载歧义报错,尤其在模板里 - 如果传了
long或long long,abs可能截断;该用labs、llabs
fabs 是浮点函数,别给 int 用
fabs 声明在 <cmath></cmath>,只接受浮点类型(float/double/long double)。给它传 int 会触发隐式转浮点,多一次转换、少一次优化,还容易掩盖类型意图。
- 错误写法:
fabs(-42)→ 编译通过但语义不清,生成的指令可能多一次cvtsi2sd - 常见误判:看到“f”以为是“fast”,其实是“floating-point”
- 若真要浮点绝对值,先明确转:
fabs(static_cast<double>(x))</double>,而不是依赖隐式转换
模板泛化时小心 std::abs 重载冲突
在泛型代码里写 std::abs(x),编译器要从一堆重载中选——int、long、float、double、std::complex……类型推导稍有偏差就失败。
- 典型报错:
error: call to 'abs' is ambiguous - 安全做法:对已知整型用非模板
abs(全局作用域),或用std::abs+ 显式模板实参:std::abs<int>(x)</int> - 自定义整型(如
__int128)不被标准abs支持,得自己特化或用条件运算符
负数边界值:INT_MIN 调 abs 是未定义行为
int 的取值范围是 [INT_MIN, INT_MAX],而 INT_MIN 的绝对值比 INT_MAX 大 1(比如 -2147483648 → 2147483648,但 INT_MAX 是 2147483647)。此时 abs(INT_MIN) 结果溢出,C++ 标准规定为未定义行为(UB)。
立即学习“C++免费学习笔记(深入)”;
- 现象:可能返回负值、崩溃、或看似正常但不可移植
- 检查方式:
x == INT_MIN时跳过abs,改用条件表达式:x (x) : x - 注意:
labs(INT_MIN)同样 UB,因为long在多数平台和int一样宽
INT_MIN 这个坑,一踩就静默出错,连 sanitizer 都不一定报。










