将数组与整数打印为十六进制

Printing array vs. integer as hex

本文关键字:十六进制 打印 整数 数组      更新时间:2023-10-16

我正在使用一个使用结构来表示数组的API(并允许在访问结构时填充该数组)。

如果数据是结构对象,方向是uint32_t,请运行以下命令:

printf("0x%08X", data->magic);

我得到的值:0xAAAABEEF

直接按原样打印数组时:

printf("0x");
for (int i = 0; i < size; ++i) {
  printf("%02X", payload[i]);
}

我得到的值:0xEFBEAAAA

结构定义如下所示:

struct Data {
  uint32_t magic;
} __attribute__((packed));

我相信数据变量是这样声明的:

// Declared and initialized somewhat like this:
uint8_t payload[kMaxSize];
Data* data = reinterpret_cast<Data*>(payload);
data->magic = 0xAAAABEEF;

我很好奇为什么 printf 不返回相同的值。是因为机器将数据存储为 LSB(最低有效字节)吗?

你的猜测是正确的。 在小端序处理器(例如:x86)中,最低有效字节首先存储在内存中。 因此,0xAAAABEEF数字将作为四个字节存储在内存中:{0xEF, 0xBE, 0xAA, 0xAA}

当程序查看内存中的这四个字节时,数据的解释方式(其类型)决定了它的外观。 如果{0xEF, 0xBE, 0xAA, 0xAA}被解释为单个字节,则得到"EF BE AA AA"。 但是如果它被解释为uint32_t,那么计算机知道颠倒顺序并将其显示为"0xAAAABEEF"。