void main () {if (sizeof (int)> -1) printf (“true”); else printf (“falso”); ;

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.