我想知道为什么 - 在我的示例代码中 - 将m_arr
的第一个元素的引用转换为更大的指针时,程序会将内存读取到m_val
字节序字节顺序?这种思维方式*(std::uint8_t*)m_arr
应该指向0x38,但它不会。
我的CPU使用little-endian字节顺序。
#include <iostream>
#include <iomanip>
int main() {
std::uint8_t m_arr[2] = { 0x5a, 0x38 };
// explain why m_val is 0x385a and not 0x5a38
std::uint16_t m_val = *(std::uint16_t*)m_arr;
std::cout << std::hex << m_val << std::endl;
return 0;
}
答案 0 :(得分:2)
字节排序是在引用为其本机类型时排列字节的顺序。无论您的机器是大端还是小端,一系列字节始终按其自然顺序排列。
您描述的情况(第一个字节为0x38
)是您在创建uint16_t
并获得uint8_t
指针时会观察到的情况。相反,你有一个uint8_t
数组,你得到一个uint16_t
指针。
答案 1 :(得分:2)
小端表示最不重要字节优先:
然后将该逻辑转换为您的数组{ 0x5a, 0x38 }
。在小端系统上,0x5a
最不重要,0x38
最重要...因此您获得0x385a
。