void main() { if(sizeof(int) > -1) printf("true"); else printf("false"); }
Esperaba que la salida fuera cierta pero es falsa. ¿Alguien por favor me puede explicar la razón de la salida.
sizeof(int)
es de tipo size_t
, que es un tipo entero sin signo. Por lo tanto, en la expresión if(sizeof(int) > -1)
, -1
se convierte en un entero sin signo, que es muy grande.
Por cierto, use int main
lugar de la int main
no void main
.
sizeof (int) devuelve size_t que es como unsigned int
.
Las conversiones aritméticas habituales se realizan implícitamente para el tipo común.
int --> unsigned int --> long --> unsigned long --> long long --> unsigned long long --> float --> double --> long double
int
valor int
(-1) se convierte en unsigned int
como parte de la conversión implícita.
-1
se representará como 0xFFFF
en 16 bit machine(for example)
.
Entonces la expresión se convierte,
if(sizeof(int) > -1 ) ==> if(2 > 0xFFFF)
Y lo false
se imprime. Sugiero probar if((int)sizeof(int) > -1 )
para un resultado adecuado.
El tipo de datos del valor proporcionado por sizeof
es size_t
que es (en la mayoría de las máquinas) un unsigned int/long
, por lo tanto, cuando lo compara con -1
, -1
se promueve de tipo a unsigned
que luego se convierte en 0xFFF..
, que es el el valor más grande que el tipo de datos puede contener, por lo tanto, su comparación falla.