Varias preguntas en este sitio web revelan dificultades al mezclar tipos firmados y no firmados y la mayoría de los compiladores parecen hacer un buen trabajo al generar advertencias de este tipo. Sin embargo, a GCC no parece importarle asignar una constante con signo a un tipo sin signo. Considere el siguiente programa:¿Por qué GCC no produce una advertencia al asignar un literal firmado a un tipo sin firmar?
/* foo.c */
#include <stdio.h>
int main(void)
{
unsigned int x=20, y=-30;
if (x > y) {
printf("%d > %d\n", x, y);
} else {
printf("%d <= %d\n", x, y);
}
return 0;
}
compilación con GCC 4.2.1 que a continuación no produce ninguna salida en la consola:
gcc -Werror -Wall -Wextra -pedantic foo.c -o foo
El ejecutable resultante genera el siguiente resultado:
$ ./foo
20 <= -30
Es Hay alguna razón por la que GCC no genera ningún mensaje de advertencia o error al asignar el valor con signo -30
a la variable entera sin signo y
?
Tenga en cuenta que debe usar% u para imprimir 'unsigned int'. –
@Bastien, de hecho; tal vez lo más interesante es que, como señaló AndreyT en su respuesta a continuación, 'printf ("% d ")' muestra el valor firmado en lugar del valor sin signo (4294967266) que utiliza el operador de comparación. – maerics
Se debe a la representación del complemento a 2 de int firmado: http://en.wikipedia.org/wiki/Two%27s_complement (esta representación no está garantizada por el estándar C, pero en la práctica nunca he oído hablar de otra representación todavía está en uso) –