關於CPU位元組存放順序的說明(大端小端)

2021-05-21 19:57:22 字數 2684 閱讀 9950

端模式(endian)的這個詞出自jonathan swift書寫的《格列佛遊記》。這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian。小人國的內戰就源於吃雞蛋時是究竟從大頭(big-endian)敲開還是從小頭(little-endian)敲開。在計算機業big endian和little endian也幾乎引起一場戰爭。在計算機業界,endian表示資料在儲存器中的存放順序。下文舉例說明在計算機中大小端模式的區別。

如果將乙個32位的整數0x12345678存放到乙個整型變數(int)中,這個整型變數採用大端或者小端模式在記憶體中的儲存由下表所示。為簡單起見,本書使用op0表示乙個32位資料的最高位元組msb(most significant byte),使用op3表示乙個32位資料最低位元組lsb(least significant byte)。

位址偏移

大端模式

小端模式

0x00

12(op0)

78(op3)

0x01

34(op1)

56(op2)

0x02

56(op2)

34(op1)

0x03

78(op3)

12(op0)

如果將乙個16位的整數0x1234存放到乙個短整型變數(short)中。這個短整型變數在記憶體中的儲存在大小端模式由下表所示。

位址偏移

大端模式

小端模式

0x00

12(op0)

34(op1)

0x01

34(op1)

12(op0)

由上表所知,採用大小模式對資料進行存放的主要區別在於在存放的位元組順序,大端方式將高位存放在低位址,小端方式將低位存放在低位址。採用大端方式進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於計算機處理。到目前為止,採用大端或者小端進行資料存放,其孰優孰劣也沒有定論。(小端是低位先存,大端高位先存)

有的處理器系統採用了小端方式進行資料存放,如intel的奔騰。有的處理器系統採用了大端方式進行資料存放,如ibm半導體和freescale的powerpc處理器。不僅對於處理器,一些外設的設計中也存在著使用大端或者小端進行資料存放的選擇。

因此在乙個處理器系統中,有可能存在大端和小端模式同時存在的現象。這一現象為系統的軟硬體設計帶來了不小的麻煩,這要求系統設計工程師,必須深入理解大端和小端模式的差別。大端與小端模式的差別體現在乙個處理器的暫存器,指令集,系統匯流排等各個層次中。

判斷大端小端

int i=1;  

char *p=(char *)&i;  

if(*p==1)    

printf("1"); 

else

printf("2");

大小端儲存問題,如果小端方式中(i佔至少兩個位元組的長度)則i所分配的記憶體最小位址那個位元組中就存著1,其他位元組是0(00000001).大端的話則1在i的最高位址位元組處存放,char是乙個位元組,所以強制將char型量p指向i則p指向的一定是i的最低位址,那麼就可以判斷p中的值是不是1來確定是不是小端。

利用共同體低位先存的特性,判斷大端小端。

int checkcpu( )

c;c.a = 1;

return(c.b ==1);

/*return 1小端先存,return 0大端先存*/ }

}剖析:

嵌入式系統開發者應該對little-endian和big-endian模式非常了解。採用little-endian模式的cpu對運算元的存放方式是從低位元組到高位元組,而big-endian模式對運算元的存放方式是從高位元組到低位元組。例如,16bit寬的數0x1234在little-endian模式cpu記憶體中的存放方式(假設從位址0x4000開始存放)為:

記憶體位址

0x4000

0x4001

存放內容

0x34

0x12

而在big-endian

模式cpu

記憶體中的存放方式則為:

記憶體位址

0x4000

0x4001

存放內容

0x12

0x34

32bit

寬的數0x12345678

在little-endian

模式cpu

記憶體中的存放方式(假設從位址

0x4000

開始存放)為:

記憶體位址

0x4000

0x4001

0x4002

0x4003

存放內容

0x78

0x56

0x34

0x12

而在big-endian

模式cpu

記憶體中的存放方式則為:

記憶體位址

0x4000

0x4001

0x4002

0x4003

存放內容

0x12

0x34

0x56

0x78

聯合體union

的存放順序是所有成員都從低位址開始存放,面試者的解答利用該特性,輕鬆地獲得了

cpu對記憶體採用

little-endian

還是big-endian

模式讀寫。如果誰能當場給出這個解答,那簡直就是乙個天才的程式設計師。

關於網路傳輸之位元組存放方式

在網路上進行資料流的傳輸是逆序進行傳輸的 協議頭中某些字段 所謂的逆序就是說 多位元組在賦值的時候是逆序賦值的,這個賦值是程式人員自己手動逆序後賦值的。可以通過函式inet addr htonl htons 等等。這樣存放後相當於是大數端對齊。但是和大數端對齊是完全的兩個概念。記憶體資料的存放方式分...

檔案的位元組順序記號

位元組順序記號是編碼為u feff的統一碼 字元 零寬度無斷空白 當以 utf 16 或 utf 32 來對ucs 或unicode字元編碼時,這個字元被用來標示其位元組序。它常被用來當做標示檔案是 utf 8 utf 16 或 utf 32 編碼格式的檔案記號。utf 8 則沒有位元組順序的概念。...

位元組順序和位域順序的討論

大端和小端的討論,一般計算機組成原理教材都會有談到,但多數不夠深入。big endian 高位位元組放到記憶體的低位位址,反之亦然。乙太網網路傳輸位元組序,powerpc,ultrasparc一類的處理器採用大端。little endian intel的ia 32架構採用。高位位元組放到記憶體高位位...