以前汇编课上讲过,但是我发现还不够。。。下面全面介绍了大端和小端。
大端和小端的历史:
一般吃鸡蛋都是打破鸡蛋大的一端再吃,但是有一次,一个国家的国王打鸡蛋时把手指弄破了,后来,他下令:以后打鸡蛋都从小端开始打。
为了讽刺这件事,就有了大端和小端的概念。
如果一个对象跨越多字节连续存储,则最小的地址就是对象的地址。
比如一个int,在32位和64位机器中都是4字节,如果对象地址为0x100,则整个int占据0x100,0x101,0x102,0x103.
我们都知道&符号,假如int x; &x就为x的地址,即0x100.
[31,30,29,.....1,0]为有效位数,最高有效位为31,最低有效位为0。
小端法:最低有效位存在最前面。
0x100 0x101
---------------------------------------------------------------------------------------------------
| 7,6,5,4,3,2,1,0 | 15,14,13,12,11,10,9,8 | ....
----------------------------------------------------------------------------------------------------
大端法:最高有效位存在最前面。
0x100 0x101
---------------------------------------------------------------------------------------------------
| 31,30,29,28,27,26,25,24| 23,22,21,20,19,18,17,16| ....
----------------------------------------------------------------------------------------------------
这两张图的对比就很明显的看出区别,就比如int x=2; 转换为16进制为0x00 00 00 02;
小端的存放顺序为:
0x100 0x101 0x102 0x103
----------------------------------------------------
| 02 | 00 | 00 | 00 |
----------------------------------------------------
上面已经说过&x取得的是0x100,一般情况下程序员是看不出字节顺序的区别的。
在linux32中,结果为小端存储。
以下是检测大端小端的代码,
记住*****:我们要检测大端小端,必须要把他转化为unsigned char * ch才可以。因为这个ch[i]是一个字节。
--------------------------------------------------------------------------------------------------------------------
int x=0x12345678;
unsigned char *val=(unsigned char *)&x; //x的地址。
val[0] 为val的地址只指向的字节。