1. 大小端模式
大端模式:数据的高字节存储在内存的低地址中。
小端模式:数据的低字节存储在内存的低地址中。
两种模式的区别就是数据在内存中是先存储高字节还是低字节,先存高字节就是大端模式,先存低字节就是小端模式。
为什么会有小端字节序?
答案是,计算机电路先处理低位字节,效率比较高。因为计算都是从低位开始处理,所以计算机的内部处理都是小端字节序。计算机读取数据时从低地址开始读。
但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。
例如:
32bit的数据 0x12345678,数据的字节顺序是左高右低,即左边是数据的高字节,右边是数据的低字节
大端模式存储方式为:
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
---|---|---|---|---|
存放内容 | 0x12 | 0x34 | 0x56 | 0x78 |
小端模式存储方式为:
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
---|---|---|---|---|
存放内容 | 0x78 | 0x56 | 0x34 | 0x12 |
2. 判断方法
方法一: 使用强制类型转换
#include <iostream>
using namespace std;
int main()
{
int a = 0x1234;
//由于 int 和 char 的长度不同,借助 int 型转换成 char 型,只会留下低地址的部分
char b = (char)(a);
if (b == 0x12)
cout << "big endian" << endl;
else if(b == 0x34)
cout << "little endian" << endl;
}
方法二:使用联合体union
结构体和联合体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而联合体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),联合体占用的内存等于最长的成员占用的内存。联合体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
#include <iostream>
using namespace std;
// 联合体占用内存的空间为每个成员字节长度的最大值
union endian
{
int a;
char b;
};
int main()
{
endian e;
e.a = 0x1234;
// a 和 b 共用 4 字节的内存空间
if (e.b == 0x12)
cout << "big endian"<<endl;
else if (e.b == 0x34)
cout << "little endian"<<endl;
}
以上两种测试方法的输出结果都是:
little endian
x86架构的CPU都是小端模式,可以验证我的机器确实是小端模式。
参考:
https://www.cnblogs.com/wangweigang/p/9679642.html
https://www.cnblogs.com/gremount/p/8830707.html