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

Jar*_*ary 2 c++ hex

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

如果data是struct对象,direction是uint32_t,请运行以下命令:

printf("0x%08X", data->magic);
Run Code Online (Sandbox Code Playgroud)

我得到的值:0xAAAABEEF

直接打印数组时:

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

我得到的值:0xEFBEAAAA

struct定义如下:

struct Data {
  uint32_t magic;
} __attribute__((packed));
Run Code Online (Sandbox Code Playgroud)

我相信数据变量声明如下:

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

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

Rya*_*ose 5

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

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