Technically speaking there is no the printf
, each library implements its own, and therefore, your method of trying to study printf
's behavior by doing what you are doing is not going to be of much use. You could be trying to study the behavior of printf
on your system, and if so, you should read the documentation, and look at the source code for printf
if it is available for your library.
For example, on my Macbook, I get the output 1606416304
with your program.
Having said that, when you pass a float
to a variadic function, the float
is passed as a double
. So, your program is equivalent to having declared a
as a double
.
To examine the bytes of a double
, you can see this answer to a recent question here on SO.
Let's do that:
#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;
}
When I run the above program, I get:
size of double: 8, int: 4
00 00 00 00 00 4a 93 40
So, the first four bytes of the double
turned out to be 0, which may be why you got 0
as the output of your printf
call.
For more interesting results, we can change the program a bit:
#include <stdio.h>
int main(void)
{
double a = 1234.5f;
int b = 42;
printf("%d %d\n", a, b);
return 0;
}
When I run the above program on my Macbook, I get:
42 1606416384
With the same program on a Linux machine, I get:
0 1083394560