consideran este programa¿Cómo se maneja la conversión de float/double a int en printf?
int main()
{
float f = 11.22;
double d = 44.55;
int i,j;
i = f; //cast float to int
j = d; //cast double to int
printf("i = %d, j = %d, f = %d, d = %d", i,j,f,d);
//This prints the following:
// i = 11, j = 44, f = -536870912, d = 1076261027
return 0;
}
Puede alguien explicar por qué la colada de doble/float a int funciona correctamente en el primer caso, y no funciona cuando se hace en printf?
Este programa fue compilado en gcc-4.1.2 en la máquina de Linux de 32 bits.
EDIT: Zach's answer parece uso lógico, es decir, de los especificadores de formato de averiguar lo que sobresalen de la pila. Sin embargo, considere esta pregunta de seguimiento:
int main()
{
char c = 'd'; // sizeof c is 1, however sizeof character literal
// 'd' is equal to sizeof(int) in ANSI C
printf("lit = %c, lit = %d , c = %c, c = %d", 'd', 'd', c, c);
//this prints: lit = d, lit = 100 , c = d, c = 100
//how does printf here pop off the right number of bytes even when
//the size represented by format specifiers doesn't actually match
//the size of the passed arguments(char(1 byte) & char_literal(4 bytes))
return 0;
}
¿Cómo funciona esto?
Tuve una duda similar. Ver este hilo: http://stackoverflow.com/questions/2377733/how-does-this-program-work – Lazer
char es un carácter único, es simplemente un entero de 8 bits. Cuando realiza cualquier tipo de operación en tipo integral que sea más pequeño que int, se promociona a entero. Esto incluye cuando se llama a una función. Así que, en realidad, no es una casualidad lo que hace que su llamada printf funcione, este comportamiento está definido. Hablando en términos prácticos, en la mayoría de las C ABI siempre asigna al menos una palabra de máquina por variable pasada en la pila. –
@SurajJain Sí, '' El parámetro que pasa solo considera los tipos promocionados según las promociones de argumento predeterminadas (C11 §6.5.2.2/6, §7.16.1.1/2), lo que garantiza que 'char' y' int' sean compatibles . Sin embargo, esto no es exactamente lo mismo que las promociones usadas para la aritmética. Además, es peligroso razonar sobre el lenguaje en términos de ABI.Confirmar que está bien realmente requiere verificar las reglas. –
Potatoswatter