c++ - C/C++ 以十六进制打印字节,得到奇怪的十六进制值

标签 c++ c

我使用以下命令以十六进制形式打印数组中的数字:

char buff[1000];

// Populate array....

int i;
for(i = 0; i < 1000; ++i)
{
    printf("[%d] %02x\n", i,buff[i]);
}

但我有时会打印奇怪的值:

byte[280] 00     
byte[281] 00     
byte[282] 0a     
byte[283] fffffff4         // Why is this a different length?
byte[284] 4e      
byte[285] 66      
byte[286] 0a   

为什么会打印“fffffff4”?

最佳答案

使用%02hhx作为格式字符串。

来自CppReference , %02x 接受 unsigned int。当您将参数传递给 printf() 时,即 variadic function , buff[i] 自动转换为 int。然后格式说明符 %02x 使 printf() 将值解释为 int,因此潜在的负值如 (char)-1 被解释并打印为 (int)-1,这就是您观察到的情况的原因。

还可以推断您的平台有签名char类型,以及32位int类型。

长度修饰符 hh 将告诉 printf() 解释以 char 类型提供的任何内容,因此 %hhxunsigned char 的正确格式说明符。

或者,您可以在打印之前将数据转换为 unsigned char。喜欢

printf("[%d] %02x\n", i, (unsigned char)buff[i]);

这还可以防止负值显示太长,因为 int 可以(几乎)始终包含 unsigned char 值。

<小时/>

请参阅以下示例:

#include <stdio.h>

int main(){
    signed char a = +1, b = -1;
    printf("%02x %02x %02hhx %02hhx\n", a, b, a, b);
    return 0;
}

上述程序的输出为:

01 ffffffff 01 ff

关于c++ - C/C++ 以十六进制打印字节,得到奇怪的十六进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57825418/

相关文章:

c++ - GCC/G++ 地址和无法读取寄存器

c++ - 尝试根据 move 赋值编写 move 构造函数

c - C 中 char 数组的错误

CCS 错误[128] 此行之前需要 #DEVICE

c - 我的平方根代码有什么问题?

c - 简单修复? '(' token 之前应为 '!'

c++ - QListView 高度根据内容

c++ - strcpy() 导致从 ‘const char*’ 到 ‘char*’ 的无效转换 [-fpermissive]

c++ - 将临时对象作为对抽象的引用传递给构造函数

c - 使用二维数组和循环的 c++ 中未显示的百分比