これの否定的な意味は、man ページに記載されています。
注意 最も負の整数の絶対値を取得しようとすることは定義されていません。
この背後にある理由と、未定義の動作を回避したい人にとって最善の手段は何ですか? 次のようなことに頼る必要がありますか?
unsigned uabs(signed val) {
return val > 0
? val
: (val == 1U << ((sizeof(val) * 8) - 1))
? -1U
: -val;
}
(stdlib の不快感を強調するために意図的にハックしています ;-)
例
4 ビットの符号付きの値があるとします (理解しやすいように)。符号なしの最大値は 15、符号付き (正) の最大値は 7、符号付き (負) の最小値は -8 なので、abs(-8) は符号付きの値には適合しません。確かに、-8 として表すことはできますが、結果を伴う除算と乗算は期待どおりに機能しません。