以前彙編課上講過,但是我發現還不夠。。。下面全面介紹了大端和小端。
大端和小端的曆史:
一般吃雞蛋都是打破雞蛋大的一端再吃,但是有一次,一個國家的國王打雞蛋時把手指弄破了,後來,他下令:以後打雞蛋都從小端開始打。
為了諷刺這件事,就有了大端和小端的概念。
如果一個對象跨越多位元組連續儲存,則最小的地址就是對象的地址。
比如一個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]是一個位元組。
--------------------------------------------------------------------------------------------------------------------
#include<stdio.h><br />typedef unsigned char *byte_pointer;<br />void show_bytes(byte_pointer start,int len)<br />{<br />int i;<br />for(i=0;i<len;i++)<br />printf(" %.2x",start[i]);<br />printf("/n");<br />}</p><p>void show_int(int x)<br />{<br />show_bytes((byte_pointer)&x,sizeof(int));<br />}<br />void show_float(float x)<br />{<br />show_bytes((byte_pointer)&x,sizeof(float));<br />}<br />void test()<br />{<br />int val=0x87654321;<br />byte_pointer valp=(byte_pointer)&val;<br />show_bytes(valp,4);<br />printf("/n");<br />int val1=3510593;<br />float val2=3510593.0;<br />show_int(val1);<br />show_float(val2);<br />}</p><p>int main()<br />{<br />test();<br />return 0;<br />}<br />
int x=0x12345678;
unsigned char *val=(unsigned char *)&x; //x的地址。
val[0] 為val的地址只指向的位元組。