me escribió el siguiente código C:C constante hexadecimal tipo
#include <stdio.h>
int main() {
printf("%d\n", -1 >> 8);
return 0;
}
puedo compilar el código con gcc 4.6.3 en mi x86_64 usando la bandera -m32. Obtengo -1 impreso como esperaría, el cambio ocurre aritméticamente usando la representación de complemento de dos que resulta en -1.
Ahora bien, si en lugar de escribir
printf("%d\n", 0xFFFFFFFF >> 8);
consigo 16777215. lo que habría esperado esta constante debe ser interpretado como un int (firmado) y luego el turno de ser la aritmética que daría lugar a -1 de nuevo. He revisado el último estándar C y parece que no puedo entender por qué este es el caso. ¿Algunas ideas?
Es la diferencia entre signed (-1) y unsigned (0xFFFFFFFF) – SpacedMonkey
@SpacedMonkey Estoy preguntando por qué 0xFFFFFFFF no tiene firma – dschatz
@SpacedMonkey Btw, '-' no contribuye a esta diferencia. '-' sigue siendo un operador unario y no hace que algo se firme. Es '1' que está firmado (y por lo tanto' -1' también está firmado), mientras que '0xFFFFFFFF' no está firmado. –