Отрицательная импликация этого отмечена на странице руководства:
ПРИМЕЧАНИЯ Попытка взять абсолютное значение наибольшего отрицательного целого не определены.
Каковы причины этого и что лучше всего подходит человеку, который хотел бы избежать поведения undefined? Должен ли я прибегать к чему-то вроде:
unsigned uabs(signed val) {
return val > 0
? val
: (val == 1U << ((sizeof(val) * 8) - 1))
? -1U
: -val;
}
(Преднамеренно взломано, чтобы подчеркнуть неудовольствие stdlib;)
Пример
Скажем, у вас было 4-значное значение знака (для удобства понимания). unsigned max - 15, подписанный (положительный) max равен 7, знак (отрицательный) min равен -8, поэтому abs (-8) не будет вписываться в значение со знаком. Конечно, вы можете представить его как -8, но тогда деление и умножение с результатом не работают должным образом.