typedef union { int n; char p[sizeof(int)]; } union_t; union_t ut; memset(&ut,0, sizeof(ut)); ut.p[0] = 13; printf("%d\n", ut.n);
输出结果是什么?
一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是Little Endian
的。少部分,如MAC OS ,是Big Endian 的。
所谓MSB (Most Significant Byte)就是,一个数字中,最重要的那位,
比如,12004,中文读作,一万两千零四,那最高位的1,就表示了一万,此处就称作MSB,最有意义的位.
而LSB (Least Significant Byte)与MSB相反,个位数4就可以称为LSB,
在草稿纸上演算的时候,我们习惯左边写数的MSB,右边写数的LSB。
使用Little Endian方式存储数据时,数据的MSB存放在高地址,LSB存放在低地址
比如 0x11223344 ,它在内存中存储为
44 33 22 11
低地址-->高地址
使用Big Endian方式存储数据时,数据的MSB存放在低地址,LSB存放在高地址
比如 0x11223344 ,它在内存中存储为
11 22 33 44
低地址-->高地址
值得注意的是,大端法和小端法讨论的都是字节与字节之间的顺序,至于一个字节内的8个比特,无论大端法还是
小端法,顺序都是一样的,即右边存储低位,左边存储高位。再看一个例子:
已知内存中从低地址到高地址存储的4个字节依次是:
11 22 33 44
求这个数是多少?
关键是找出哪头是MSB,哪头是LSB
如果该机器是Little Endian,
则低地址存放的是LSB,所以11是LSB,高地址是MSB,所以44是MSB
所以这个数等于
0x44332211
如果该机器是Big endian,
则低地址存放的是MSB,所以11是MSB,高地址是LSB,所以44是LSB
0x11223344
这个笔试题的意思是,已知内存中从低地址到高地址存储的4个字节是
0D 00 00 00
使用小端法表示,这个数等于0x0000000D,即13。
再引申一个问题,试写一个函数判断机器是否为Big Endian。
思想是取一个short数0x1122的第1个字节,若这个字节等于0x11,则是大端法
int is_big_endian() { unsigned short test = 0x1122; if(*( (unsigned char*) &test ) == 0x11) return 1; else return 0; }