在 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
.
我想知道为什么——在我的示例代码中——当将对 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
.