【发布时间】:2010-12-09 07:37:18
【问题描述】:
手册页中指出了这一点的负面影响:
注意事项 试图取最大负整数的绝对值是 不是 已定义。
这背后的原因是什么?对于想要避免未定义行为的人来说,最好的办法是什么?我是否必须求助于:
unsigned uabs(signed val) {
return val > 0
? val
: (val == 1U << ((sizeof(val) * 8) - 1))
? -1U
: -val;
}
(为了强调对 stdlib 的不满而故意弄巧成拙 ;-)
示例
假设您有一个 4 位有符号值(为了便于理解)。无符号最大值为 15,有符号(正)最大值为 7,有符号(负)最小值为 -8,因此 abs(-8) 不适合有符号值。当然,您可以将其表示为 -8,但结果的除法和乘法无法按预期工作。
【问题讨论】: