理解小端大端存储模式
小端大端参考文章
1. 大端模式和小端模式
/*
字节序 -> 多字节数据在内存中的存储顺序, 分为 大端模式 和 小端模式 两种存储方法
小端模式 -> 高字节数据存储在高地址 速记: 小 (小端) 高 (高字节) 高 (高地址)
大端模式 -> 高字节数据存储在低地址
*/
/*
举个例子:
对于 32位整型数据 0x12345678, 它在大端和小端两种模式下是这样存储的:
低地址 ---------> 高地址
小端: 0x78 0x56 0x34 0x12
大端: 0x12 0x34 0x56 0x78
*/
2. 主机字节序和网络字节序
/*
主机字节序:
不同的主机有不同的字节序, 如 x86为小端模式, Motorla 6800为大端模式
*/
/*
网络字节序:
TCP/IP中规定好的一种数据表示格式, 它与具体的 CPU类型操作系统等无关, 从而保证数据在不同主机之间传输时能够被正确解释
网络字节序规定, 收到的第一个字节被当作高位看待, 这就要求发送端发送的第一个字节应当是高位。
而在发送端发送数据时, 发送的第一个字节是该数据在内存中起始地址对应的字节
可见网络字节顺序采用 big endian(大端)排序方式
*/
/*
字节序转换注意事项:
只有在多字节数据处理时才需要考虑字节序;
运行在同一台计算机上的进程相互通信时,一般不用考虑字节序;
异构计算机之间通讯, 需要转换自己的字节序为网络字节序
*/
3. 判断大小端模式
#include <iostream>
using namespace std;
union MyUnion
{
char _str[4];
unsigned int _uNum;
};
int main()
{
unsigned int uNum = 0x12345678;
char *ptr = (char*)&uNum;
for (int i = 0; i < 4;++i)
{
std::printf("%x", *ptr);
++ptr;
}
/* 或者使用共用体实现
MyUnion mUnion;
mUnion._uNum = 0x12345678;
for (int i = 0; i < 4; ++i)
{
std::printf("%x", *(mUnion._str + i));
}
*/
return 0;
}
/*
result: 78563412
从输出结果可以看出本机采用小端存储模式, 高字节 0x12存储在高地址
*/