voglio eseguire alcune aritmetica senza segno, e la necessità di prendere valore assoluto di int negativo, qualcosa comemodo corretto di prendere valore assoluto di 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...
}
Ma INT_MIN potrebbe essere problematico, 0 - INT_MIN è UB se eseguito in aritmetica firmata. Che cosa è un modo standard/robusto/sicuro/efficace per farlo in C?
EDIT:
Se sappiamo di essere in 2-complemento, forse cast implicito e ops bit esplicite sarebbe normale? se possibile, vorrei evitare questa ipotesi.
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...
}
Oh, e nel caso puramente teorico in cui 'UINT_MAX == INT_MAX == - (INT_MIN + 1)', è impossibile rappresentare '| INT_MIN |' come int' 'senza segno comunque =) –
@DanielFischer: questo caso è effettivamente possibile, dato che 'int' e' unsigned int' devono avere le stesse dimensioni e requisiti di allineamento? –
È possibile che 'unsigned int' possa avere un bit di riempimento più di 'int'. Non ho mai sentito di un'implementazione in cui sia così, ma lo standard non garantisce che non accada mai. (A meno che non abbia trascurato qualcosa.) –