printf muestra algo raro

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.

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