理解 printf 将字节打印为十六进制时的意外输出
使用矢量数据类型(如包含 char 元素的 Pixel_data)时,通常会出现以下情况:尝试以十六进制格式打印单个字节时遇到意外结果。具体来说,使用 printf(" 0x%1x ", Pixel_data[0] ) 打印 Pixel_data[0] 可能会产生 0xfffffff5,而不是预期的 0xf5。
此行为源于 printf 的一个特性,其中 %x 修饰符预期无符号整数作为其参数。因此,char 值(在提供给 varargs 函数时通常会提升为整数)被 printf 视为 int。
为了获得可靠的结果,建议显式转换为 unsigned int :
printf(" 0x%1x ", (unsigned)pixel_data[0] );
此外,字段宽度为 1 可能并不理想,因为它指定了要显示的最小位数,并且始终至少有一位数字
如果系统上的 char 作为有符号类型处理,则转换可能会导致为负 char 值生成较大的无符号 int 值(例如 fffffff5)。为了确保字节值被视为无符号,请对像素数据使用无符号字符,通过无符号字符进行转换,或使用掩码操作:
printf(" 0x%x ", (unsigned)(unsigned char)pixel_data[0] ); printf(" 0x%x ", (unsigned)pixel_data[0] & 0xffU );
以上是为什么'printf”在打印字节时显示意外的十六进制输出?的详细内容。更多信息请关注PHP中文网其他相关文章!