quiero realizar algunas aritmética de firmar, y la necesidad de tomar el valor absoluto de int negativo, algo así comomanera correcta para tomar el valor absoluto de 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...
}
Pero INT_MIN podría ser problemático, 0 - INT_MIN es UB si se realiza en aritmética firmada. ¿Cuál es una forma estándar/robusta/segura/eficiente de hacer esto en C?
EDIT:
Si sabemos que estamos en 2-complemento, tal conversión implícita y explícita de operaciones de bits sería estándar? si es posible, me gustaría evitar esta suposición.
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, y en el caso puramente teórico donde 'UINT_MAX == INT_MAX == - (INT_MIN + 1)', es imposible representar '| INT_MIN |' 'como un int' sin signo de todos modos =) –
@DanielFischer: ¿ese caso es realmente posible, dado que 'int' y' unsigned int' deben tener los mismos requisitos de tamaño y alineación? –
Es posible, 'unsigned int' podría tener un bit de relleno más que' int'. Nunca he oído hablar de una implementación donde ese es el caso, pero el estándar no garantiza que nunca suceda. (A menos que haya pasado por alto algo) –