Chcę wykonać pewne działania arytmetyczne w niepodpisany, i trzeba podjąć bezwzględną wartość ujemną int, coś jakPrawidłowy sposób podjąć bezwzględną wartość INT_MIN
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...
}
Ale INT_MIN może być problematyczne, 0 - INT_MIN jest UB jeśli jest wykonywany z arytmetyczną sygnaturą. Co to jest standardowy/solidny/bezpieczny/skuteczny sposób na wykonanie tego w języku C?
EDIT:
Jeśli wiemy, że jesteśmy w 2-uzupełnienie, być może ukryte i jawne oddanych bitowe ops byłoby standard? jeśli to możliwe, chciałbym uniknąć tego założenia.
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...
}
Aha, w czysto teoretycznym przypadku, gdy 'UINT_MAX == INT_MAX == - (INT_MIN + 1)', nie jest możliwe do reprezentowania '| INT_MIN |' 'jako unsigned int' anyway =) –
@ Danielanischer: czy ten przypadek jest rzeczywiście możliwy, zważywszy, że 'int' i' unsigned int' muszą mieć takie same wymagania dotyczące rozmiaru i wyrównania? –
Jest możliwe, że 'unsigned int' może mieć jeszcze jeden bit padding niż' int'. Nigdy nie słyszałam o takiej implementacji, ale standard nie gwarantuje, że nigdy się nie stanie. (O ile nie przeoczyłem czegoś.) –