¿Por qué printf ("% f", 0); dar un comportamiento indefinido?

La declaración

printf("%f\n",0.0f);

imprime 0.

Sin embargo, la declaración

printf("%f\n",0);

Imprime valores aleatorios.

Me doy cuenta de que estoy exhibiendo algún tipo de comportamiento indefinido, pero no puedo entender por qué específicamente.

Un valor de coma flotante en el que todos los bits son 0 sigue siendo válidofloat con valor de 0.
float yint son del mismo tamaño en mi máquina (si eso es relevante).

¿Por qué usar un literal entero en lugar de un literal de coma flotante enprintf causar este comportamiento?

PD se puede ver el mismo comportamiento si uso

int i = 0;
printf("%f\n", i);

Respuestas a la pregunta(10)

Su respuesta a la pregunta