Tecnicamente falando, não existe o printf , cada biblioteca implementa seu próprio e, portanto, seu método de tentar estudar printfo comportamento fazendo o que você está fazendo não será muito útil. Você pode estar tentando estudar o comportamento do printfem seu sistema e, nesse caso, deve ler a documentação e olhar o código-fonte para ver printfse ele está disponível para sua biblioteca.
Por exemplo, no meu Macbook, recebo a saída 1606416304com o seu programa.
Dito isto, quando você passa a floatpara uma função variável, o floaté passado como a double. Portanto, seu programa é equivalente a ter sido declarado acomo um double.
Para examinar os bytes de a double, você pode ver esta resposta a uma pergunta recente aqui no SO.
Vamos fazer isso:
#include <stdio.h>
int main(void)
{
double a = 1234.5f;
unsigned char *p = (unsigned char *)&a;
size_t i;
printf("size of double: %zu, int: %zu\n", sizeof(double), sizeof(int));
for (i=0; i < sizeof a; ++i)
printf("%02x ", p[i]);
putchar('\n');
return 0;
}
Quando executo o programa acima, obtenho:
size of double: 8, int: 4
00 00 00 00 00 4a 93 40
Então, os primeiros quatro bytes do doubleacabaram sendo 0, que pode ser o motivo pelo qual você obteve 0como saída de sua printfchamada.
Para resultados mais interessantes, podemos mudar um pouco o programa:
#include <stdio.h>
int main(void)
{
double a = 1234.5f;
int b = 42;
printf("%d %d\n", a, b);
return 0;
}
Quando executo o programa acima no meu Macbook, obtenho:
42 1606416384
Com o mesmo programa em uma máquina Linux, obtenho:
0 1083394560