手册页中指出了这一点的负面影响:
NOTES 没有定义试图取最大负整数的绝对值。
这背后的原因是什么?对于想要避免未定义行为的人来说,最好的办法是什么?我是否必须求助于:
unsigned uabs(signed val) {
return val > 0
? val
: (val == 1U << ((sizeof(val) * 8) - 1))
? -1U
: -val;
}
(故意 hacky 以强调对 stdlib 的不满 ;-)
例子
假设您有一个 4 位有符号值(为了便于理解)。无符号最大值为 15,有符号(正)最大值为 7,有符号(负)最小值为 -8,因此 abs(-8) 不适合有符号值。当然,您可以将其表示为 -8,但是结果的除法和乘法不能按预期工作。