Hay tal código:
#include int main() { float d = 1.0; int i = 2; printf("%d %d", d, i); getchar(); return 0; }
Y la salida es:
0 1072693248
Sé que hay un error en printf y la primera% d debe reemplazarse con% f. Pero, ¿por qué la variable i está mal impresa (1072693248 en lugar de 2)?
Ya que especificó %d
lugar de %f
, lo que realmente está viendo es la representación binaria de d
como un entero.
Además, dado que los tipos de datos no coinciden, el código en realidad tiene un comportamiento indefinido.
EDITAR:
Ahora para explicar por qué no ves el 2
:
float
se promueve para double
en la stack. Tipo double
tiene (en este caso) 8 bytes de longitud. Sin embargo, dado que su printf
especifica dos enteros (ambos de 4 bytes en este caso), está viendo las representaciones binarias de 1.0
como un tipo double
. El 2 no se imprime porque está más allá de los 8 bytes que espera su printf
.
printf
no solo usa los códigos de formato para decidir cómo imprimir sus argumentos. Los usa para decidir cómo acceder a sus argumentos (usa va_arg
internamente). Debido a esto, cuando da el código de formato incorrecto para el primer argumento ( %d
lugar de %f
) no solo arruina la impresión del primer argumento, hace que se vea en el lugar equivocado para todos los argumentos subsiguientes . Es por eso que te estás poniendo sin sentido para el segundo argumento.
Necesitas saber cómo funciona printf. La persona que llama pone todos los argumentos en la stack. A medida que se analiza a través de la cadena fmt, la primera vez que ve un% d, selecciona la primera palabra de 4 bytes en la stack y la imprime como un entero. La segunda vez que ve un% d, selecciona la siguiente palabra de 4 bytes. Lo que está viendo es que los bytes flotantes sin procesar se muestran como dos enteros.
¿Está firmado o sin firmar?
Use esto como referencia: http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/format.html
Un flotador se almacena en la memoria en un formato especial, no es solo un número y algunos decimales ver Cómo representar el número de FLOTADOR en la memoria en C