大端模式和小端模式指的是CPU存放变量的方式,即字节序:
对于小端模式的CPU:对操作数的存放方式是从低字节到高字节
例如, 0x12345678,低位字节为78,高位字节为12,小端模式存储方式为:
// 地址:操作数
0x2000: 0x78
0x2001: 0x56
0x2002: 0x34
0x2003: 0x12
对于大端模式的CPU:对操作数的存放方式是从高字节到低字节
例如, 0x12345678,低位字节为78,高位字节为12,大端模式存储方式为:
// 地址:操作数
0x2000: 0x12
0x2001: 0x34
0x2002: 0x56
0x2003: 0x78
因为联合体union的存放顺序是所有成员都从低地址开始存放,因此使用以下程序,可以检查CPU采用的读写模式:
#include <iostream>
using namespace std;
union w {
int a;
char b[4];
} u;
bool checkCPU() {
u.a = 0x01020304; // 01 02 03 04, 低位字节 - 04
printf("%0x%0x%0x%0x\n", u.b[0], u.b[1], u.b[2], u.b[3]);
return u.b[0] == 0x04;
}
int main() {
if (checkCPU()) {
cout << "Little-endian" << endl;
} else {
cout << "Big-endian" << endl;
}
return 0;
}
输出:
4321
Little-endian
可以看到,联合体成员b的首字节为04,因此变量a的读取方式是从低字节到高字节,因此是小端模式。
谢谢阅读