读取文件十六进制字节时printf输出出现前导FF的原因问询
问题原因解析
这个现象的核心是有符号字符的符号扩展,具体逻辑如下:
- 绝大多数编译器默认将
char视为有符号类型(等价于signed char),其取值范围是-128到127。当你读取的十六进制字节值超过0x7F(比如0xE1,对应十进制-31)时,该字节的最高位是1(符号位)。 - 在使用
printf的%x格式输出,或用std::hex输出时,char类型会被默认提升为int类型(C/C++的默认参数提升规则)。此时,有符号字符的符号位会被填充到int的所有高位,导致原本的单字节0xE1被扩展成0xFFFFFFE1。
验证与解决方向
- 直接用
unsigned char数组存储读取的字节,彻底避免符号扩展问题,比如声明unsigned char message[26];。 - 如果已经使用
char数组,输出前先强制转换为无符号类型截断高位:printf("0x%02x", (unsigned int)(unsigned char)message[2]);。
内容的提问来源于stack exchange,提问作者David Scott
相关产品推荐
相关产品推荐

