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

时间:2015-04-14 00:53:30

标签: c++ endianness

我想知道为什么 - 在我的示例代码中 - 将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;
}

2 个答案:

答案 0 :(得分:2)

字节排序是在引用为其本机类型时排列字节的顺序。无论您的机器是大端还是小端,一系列字节始终按其自然顺序排列。

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

答案 1 :(得分:2)

小端表示最不重要字节优先:enter image description here

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