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

时间:2016-03-04 05:59:49

标签: c++ hex

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

如果data是struct对象,direction是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(最低有效字节)?

1 个答案:

答案 0 :(得分:5)

你的猜测是正确的。在little-endian processor中(例如: x86 ),最低有效字节首先存储在内存中。因此,数字0xAAAABEEF将存储为内存中的四个字节:{0xEF, 0xBE, 0xAA, 0xAA}

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