So, I realize that %u
is for printing an unsigned int
. And unsigned int
is usually more than a single byte (typically 32 bits/4 bytes I think) on most systems. unsigned char
is always one byte. So, is it safe to use the %u
format specifier to print a byte as a number? Will type promotion kick in? Or does the variadic argument list muck things up? Here's a simple example:
#include <stdio.h>
int main()
{
unsigned char val = 'A';
printf("%u", val); // is this safe?
}
Assuming an ASCII encoding, the output should be 65
. However, as %u
is technically for unsigned int
rather than unsigned char
, I'm curious if there are there cases where I would get bytes of garbage, or access the stack in an unexpected way.
CodePudding user response:
%u
expects an unsigned int
, so you will have to cast the unsigned char
when passing it to %u
, eg:
printf( "%u", (unsigned int) val );
It is likely that when passing the unsigned char
as-is, it gets promoted to the size of the unsigned int
when pushed onto the call stack, in which case %u
may work without casting, but you should not rely on that behavior. Jut pass the correct type to begin with.
Alternatively, you can use %hhu
instead (C99 ), which expects an unsigned char
, eg:
printf( "%hhu", val );