Tecnicamente falando, não existe o printf
, cada biblioteca implementa seu próprio e, portanto, seu método de tentar estudar printf
o comportamento fazendo o que você está fazendo não será muito útil. Você pode estar tentando estudar o comportamento do printf
em seu sistema e, nesse caso, deve ler a documentação e olhar o código-fonte para ver printf
se ele está disponível para sua biblioteca.
Por exemplo, no meu Macbook, recebo a saída 1606416304
com o seu programa.
Dito isto, quando você passa a float
para uma função variável, o float
é passado como a double
. Portanto, seu programa é equivalente a ter sido declarado a
como 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 double
acabaram sendo 0, que pode ser o motivo pelo qual você obteve 0
como saída de sua printf
chamada.
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