Why is the format specifier for uint8_t and uint16_t the same (%u)?
Solution 1
printf()
is a variadic function. Its optional arguments( and only those ) get promoted according to default argument promotions( 6.5.2.2. p6 ).
Since you are asking for integers, integer promotions are applied in this case, and types you mention get promoted to int
. ( and not unsigned int
because C )
If you use "%u"
in printf(), and pass it an uint16_t
variable, then the function converts that to an int
, then to an unsigned int
( because you asked for it with %u ) and then prints it.
Solution 2
Because %u stands for "unsigned", it well may be uint64_t and is architecture dependent. According to man 3 printf
, you may want to use length modifier to get sought behaviour, i.e. %hu (uint16_t) and %hhu (uint8_t).
Rev
Updated on July 09, 2022Comments
-
Rev almost 2 years
I only found pretty unrelated questions due to the tons of results searching for
printf()
.Why does
uint8_t
not specify its own format string but any other type does?As far as I understand
printf()
, it has to know the length of the supplied parameters to be able to parse the variable argument list.Since
uint8_t
anduint16_t
use the same format specifier%u
, how doesprintf()
"know" how many bytes to process? Or is there somehow an implicit cast touint16_t
involved when supplyinguint8_t
?Maybe I am missing something obvious.
-
Basile Starynkevitch over 9 yearsThis promotion also happens for non-variadic functions.
-
2501 over 9 years@BasileStarynkevitch No it does not.
-
mafso over 9 yearsIt also happens for non-prototyped functions, in case that's what Basile's getting at.
-
Bram over 7 yearsDo you mean %hhu ? I think length modifier is prefixed, not postfixed.
-
wick over 6 years@Bram: thank you. Fixed.