动态检查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来源于《奥列佛游记》,整个国家 因为“吃鸡蛋时,从大端开始吃还是从小端开始吃?”的问题而数次发生战争。 反映到计算机里就是:存放数据时,从大端开始还是从小端开始? */
|