Why does printf not print out just one byte when p

2019-01-02 21:10发布

pixel_data is a vector of char.

When I do printf(" 0x%1x ", pixel_data[0] ) I'm expecting to see 0xf5.

But I get 0xfffffff5 as though I was printing out a 4 byte integer instead of 1 byte.

Why is this? I have given printf a char to print out - it's only 1 byte, so why is printf printing 4?

NB. the printf implementation is wrapped up inside a third party API but just wondering if this is a feature of standard printf?

标签: c++ c printf
5条回答
流年柔荑漫光年
2楼-- · 2019-01-02 21:29

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 );
查看更多
伤终究还是伤i
3楼-- · 2019-01-02 21:32

Use %hhx

printf("%#04hhx ", foo);
查看更多
忆尘夕之涩
4楼-- · 2019-01-02 21:36

Width-specifier in printf is actually min-width. You can do printf(" 0x%2x ", pixel_data[0] & 0xff) to print lowes byte (notice 2, to actually print two characters if pixel_data[0] is eg 0xffffff02).

查看更多
只靠听说
5楼-- · 2019-01-02 21:51

Then length modifier is the minimum length.

查看更多
低头抚发
6楼-- · 2019-01-02 21:53

Better use the standard-format-flags

printf(" %#1x ", pixel_data[0] );

then your compiler puts the hex-prefix for you.

查看更多
登录 后发表回答