我正在使用一个使用结构来表示数组的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(最低有效字节)?
答案 0 :(得分:5)
你的猜测是正确的。在little-endian processor中(例如: x86 ),最低有效字节首先存储在内存中。因此,数字0xAAAABEEF
将存储为内存中的四个字节:{0xEF, 0xBE, 0xAA, 0xAA}
当你的程序查看内存中的这四个字节时,解释数据的方式 - 它的类型 - 决定了它的外观。如果将{0xEF, 0xBE, 0xAA, 0xAA}
解释为单个字节,则会获得“EF BE AA AA”。但如果它被解释为uint32_t
,则计算机知道要颠倒顺序并将其显示为“0xAAAABEEF”。