Conversión forzada entre números enteros y puntos flotantes y caracteres de formato de salida en lenguaje C
/ /Segunda vez
int a = 3; double b = 1; b = 1/a;
printf(" %-15d % -15d %-15f %-15f " , 1.0/a, b, 1.0/a, b);
Resultado de salida: 1431655765 10438+0 0.0000000 0.500000005
La pila es doble , doble, doble, doble (8, 8, 8, 8); 1.0/3, 0.0, 1.0/3, 0.0
Int, int, float y float (4, 4, 8, 8) se utilizan en la función.
Análisis: Primero, los 8 bytes ocupados por 1.0/3 se dividen uniformemente en 4 bytes y se generan como int; el segundo 0.0 se genera como flotante; 0.0 es inútil; por lo que el resultado es equivalente a printf(" %-15d %-15d %-15f %-15f ", 1.0/a, b, 1.0/a); (" %-15d %- 15d %-15f %-15f ", 1.0/a, b, b) el resultado es equivalente a printf(" %-15d %-15d %-15f %-15f ", 1.0/a); , b, 1.0/3);
//Tercera revisión
int a = 3;
Doble b = 1; b = 1.0/a;
printf(" %-15d %-15d %-15f %-15f ", 1/a, b, 1/a, b); El resultado de salida es: 0 14165565 0 000000 0.500001
Los tipos de bytes insertados en la pila son int, double, int y double (4, 8, 4, 8); 1.0/3
Los bytes utilizados en la función son int, int, float y float (4, 4, 8, 8).
Obviamente en la segunda posición; se tomarán los primeros 4 bytes del tipo 1.0/3double; luego los últimos cuatro bytes de 1.0/3double, los cuatro bytes de 0int, 1.0/3 ocho bytes. Los dos 4 bytes restantes se convierten juntos en tipo flotante. El resultado de doube es 5.291174399002 e-315, que es 0 cuando se convierte en flotante 1.0/3 se convierte en número de punto flotante y es 0.333333.
//Cuarta revisión
int a = 3;
Doble b = 1;
b = 1.0/a; p>
printf(" %-15d %-15d %-15f %-15f ", 1.0/a, b, 1.0/a, b
Resultado de salida: 14165765+0438 +0.000000001);
Los tipos de bytes insertados en la pila son int, double, int y double (4, 8, 4, 8); >
Los bytes utilizados en la función son int, int, float y float (4, 4, 8, 8).
Según el análisis anterior, este debe ser el resultado.
Equivalente a printf(" %-15d %-15d %-15f %-15f ", 1.0/a, b, 1.0/a
);