为什么printf在打印hex时只打印出一个字节?

Bee*_*and 34 c c++ printf

pixel_datavectorchar.

当我这样做时,printf(" 0x%1x ", pixel_data[0] )我期待着看到0xf5.

但我觉得0xfffffff5我打印出一个4字节的整数而不是1字节.

为什么是这样?我给printf了一个char打印输出 - 它只有1个字节,为什么printf打印4?

NB.在printf实现包裹第三方API内,但只是想知道,这是标准的功能printf

CB *_*ley 54

您可能正在获得一种良性形式的未定义行为,因为%x修饰符需要一个unsigned int参数,并且char通常会int在传递给varargs函数时将其提升为.

您应该显式地将char转换为a unsigned int以获得可预测的结果:

printf(" 0x%1x ", (unsigned)pixel_data[0] );
Run Code Online (Sandbox Code Playgroud)

请注意,字段宽度为1不是很有用.它仅指定要显示的最小位数,并且在任何情况下都至少需要一位数.

如果char您的平台上已签名,则此转换会将负值转换char为较大的unsigned int值(例如fffffff5).如果你要正确对待字节值都是无符号数,只是零扩展时转换为unsigned int你应该使用unsigned charpixel_data,或通过浇铸unsigned char或升级后使用屏蔽操作.

例如

printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] );
Run Code Online (Sandbox Code Playgroud)

要么

printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
Run Code Online (Sandbox Code Playgroud)


use*_*313 7

更好地使用标准格式标志

printf(" %#1x ", pixel_data[0] );
Run Code Online (Sandbox Code Playgroud)

然后你的编译器为你输入十六进制前缀.


dom*_*men 6

使用%hhx

printf("%#04hhx ", foo);
Run Code Online (Sandbox Code Playgroud)