Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中处理endianness和数组时结果不一致+;_C++_Endianness - Fatal编程技术网

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类型与元素的类型相同。