pixel_data是vector的char.
当我这样做时,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 char的pixel_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)
更好地使用标准格式标志
printf(" %#1x ", pixel_data[0] );
Run Code Online (Sandbox Code Playgroud)
然后你的编译器为你输入十六进制前缀.
| 归档时间: |
|
| 查看次数: |
43507 次 |
| 最近记录: |