I want to know for my own knowledge what happens behind and why it prints nan
when I use it with %f
or a long number when used with %lf
Several reasons.
First of all, printf
doesn't know the types of the additional arguments you actually pass to it. It's relying on the format string to tell it the number and types of additional arguments to expect. If you pass a size_t
as an additional argument, but tell printf
to expect a float
, then printf
will interpret the bit pattern of the additional argument as a float
, not a size_t
. Integer and floating point types have radically different representations, so you'll get values you don't expect (including NaN).
Secondly, different types have different sizes. If you pass a 16-bit short
as an argument, but tell printf
to expect a 64-bit double
with %f
, then printf
is going to look at the extra bytes immediately following that argument. It's not guaranteed that size_t
and double
have the same sizes, so printf
may either be ignoring part of the actual value, or using bytes from memory that isn't part of the value.
Finally, it depends on how arguments are being passed. Some architectures use registers to pass arguments (at least for the first few arguments) rather than the stack, and different registers are used for floats vs. integers, so if you pass an integer and tell it to expect a double with %f
, printf
may look in the wrong place altogether and print something completely random.
printf
is not smart. It relies on you to use the correct conversion specifier for the type of the argument you want to pass.