Why does printf not print out just one byte when printing hex?
You're probably getting a benign form of undefined behaviour because the %x
modifier expects an unsigned int
parameter and a char
will usually be promoted to an int
when passed to a varargs function.
You should explicitly cast the char to an unsigned int
to get predictable results:
printf(" 0x%1x ", (unsigned)pixel_data[0] );
Note that a field width of one is not very useful. It merely specifies the minimum number of digits to display and at least one digit will be needed in any case.
If char
on your platform is signed then this conversion will convert negative char
values to large unsigned int
values (e.g. fffffff5
). If you want to treat byte values as unsigned values and just zero extend when converting to unsigned int
you should use unsigned char
for pixel_data
, or cast via unsigned char
or use a masking operation after promotion.
e.g.
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] );
or
printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
Better use the standard-format-flags
printf(" %#1x ", pixel_data[0] );
then your compiler puts the hex-prefix for you.
Use %hhx
printf("%#04hhx ", foo);
Then length
modifier is the minimum length.