Я хочу выполнить некоторую арифметику в unsigned и нужно принять абсолютное значение отрицательного int, что-то вроде
do_some_arithmetic_in_unsigned_mode(int some_signed_value)
{
unsigned int magnitude;
int negative;
if(some_signed_value<0) {
magnitude = 0 - some_signed_value;
negative = 1;
} else {
magnitude = some_signed_value;
negative = 0;
}
...snip...
}
Но INT_MIN может быть проблематичным, 0 - INT_MIN является UB, если выполняется в подписанной арифметике. Что такое стандартный/надежный/безопасный/эффективный способ сделать это в C?
EDIT:
Если мы знаем, что мы находимся в 2-дополнении, возможно, неявный литой и явный бит ops будет стандартным? если возможно, я хотел бы избежать этого предположения.
do_some_arithmetic_in_unsigned_mode(int some_signed_value)
{
unsigned int magnitude=some_signed_value;
int negative=some_signed_value<0;
if (negative) {
magnitude = (~magnitude) + 1;
}
...snip...
}