关于大端法和小端法
?
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;elsereturn 0;}