Compile using gcc 4.1.2 on CentOS-5 64 bit.
Printing an integer as a two-character hex string:
#include
#include
It's because %x
has default size of int.
If you want char, use %hhx
Or better, you have the macros in <cinttypes>, like PRIx8
When you pass char
value to sprintf() or any other variadic C function it is promoted to int
value -1 in this case. Now you print it as unsigned int
by "%X" spec, so you get long number with FF. unsigned char
on another side promoted to unsigned int
so you get 0xFF integer value which is printed as 2 symbols.
Note: the fact that you specify %X - unsigned int in printf()
formatting only affects how printf function treats the value passed to it. Char -> int promotion happens before printf()
called and format specifier does not have effect, only type of the value you are passing.
A int8_t
will go through the usual integer promotions as a parameter to a variadic function like printf()
. This typically means the int8_t
is converted to int
.
Yet "%X"
is meant for unsigned
arguments. So covert to some unsigned type first and use a matching format specifier:
For uint8_t
, use PRIX8
. With exact width types, include <inttypes.h>
for the matching specifiers.
#include <inttypes.h>
printf(" int negative var is <%02" PRIX8 ">\n", iNegVar);`
With int8_t iNegVar = -1;
, convert to some unsigned type before printing in hex
printf(" int negative var is <%02" PRIX8 ">\n", (uint8_t) iNegVar);`