在 C++ 中处理字节序和数组时结果不一致

Inconsistent results when dealing with endianness and arrays in C++

我想知道为什么——在我的示例代码中——当将对 m_arr 的第一个元素的引用转换为更大尺寸的指针时,程序会在很小的时间内将内存读取到 m_val字节顺序?按照这种思路 *(std::uint8_t*)m_arr 应该指向 0x38,但它没有。

我的 CPU 使用小端字节顺序。

#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;
}

字节顺序是字节被引用为它们的本机类型时的布局顺序。无论您的机器是大端还是小端,字节序列始终是其自然顺序。

您描述的情况(第一个字节是 0x38)是您创建 uint16_t 并获得指向它的 uint8_t 指针时观察到的情况。相反,你有一个 uint8_t 数组,你得到一个指向它的 uint16_t 指针。

Little endian 表示 最低位 字节在前:

所以将该逻辑转换为您的数组,{ 0x5a, 0x38 }。在小端系统上,0x5a 最不重要,0x38 最重要...因此你得到 0x385a.