Endian of CPU

动态检查CPU是little endian还是big endian。

先上代码,再解释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#define IS_BIG_ENDIAN ({
union {
int i;
char c[sizeof(int)];
} u;

u.i = 1;
u.c[sizeof(int)-1] == 1;
})

/*
说明: 0xHH,一个H代表4个比特,所以0100,0010就可以表示为0x42
假设sizeof(int) == 4,整数的最高有效位为1,表示符号,所以
高有效位是0x1000,0000,即0x80.

下面是little endian的表述,即低有效位对应低内存地址
31 0
+---------------------------+
| 0x80 | 0x00 | 0x00 | 0x01 |
+---------------------------+
c[3] c[2] c[1] c[0]

下面是big endian的表述,即高有效位对应低内存地址
31 0
+---------------------------+
| 0x01 | 0x00 | 0x00 | 0x80 |
+---------------------------+
c[3] c[2] c[1] c[0]

因为CPU总是按照从内存地址到高内存地址的顺序放置内容,
所以上面描述等价于:
little endian: 先放低有效位
big endian: 先放高有效位

little endian, big endian来源于《奥列佛游记》,整个国家
因为“吃鸡蛋时,从大端开始吃还是从小端开始吃?”的问题而数次发生战争。
反映到计算机里就是:存放数据时,从大端开始还是从小端开始?
*/