C++ 在C+中处理endianness和数组时结果不一致+;
我想知道为什么在我的示例代码中,当将对C++ 在C+中处理endianness和数组时结果不一致+;,c++,endianness,C++,Endianness,我想知道为什么在我的示例代码中,当将对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 w
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;
}
#包括
#包括
int main(){
std::uint8_t m_arr[2]={0x5a,0x38};
//解释为什么m_val是0x385a而不是0x5a38
std::uint16_t m_val=*(std::uint16_t*)m_arr;
std::cout字节顺序是字节作为其本机类型引用时的排列顺序。无论您的机器是大尾端还是小尾端,字节序列始终按其自然顺序排列
您描述的情况(其中第一个字节为0x38
)如果你创建了一个uint16\u t
并得到一个指向它的uint8\u t
指针,你就会观察到。相反,你有一个uint8\u t
数组,你会得到一个指向它的uint16\u t
指针。小尾端意味着最低有效的字节在第一位:
因此,将该逻辑转换为数组,{0x5a,0x38}
。在一个小端点系统上,0x5a
是最不重要的,而0x38
是最重要的…因此,您得到的0x385a
代码具有未定义的行为。也就是说,这看起来非常完美。小端点(最不重要的一端)是第一个数组元素。值是a[0]+0x100*a[1]
。这就是“little endian”的意思。这是little endian系统的预期行为,不是吗?最低有效字节(0x5a)位于较低的地址。此代码违反结构别名规则(类型为uint16\u t
的左值用于访问不同的内容)*(std::uint8_t*)m_arr
不应指向0x38。您正在获取一个std::uint8_t
数组,并执行显式的数组到指针转换。这将返回指向第一个元素的指针。Endianness在那里是不相关的,因为pointee类型与元素的类型相同。