大端序與小端序——字節序與位域的存儲


  談到字節序的問題,必然牽涉到兩大CPU派系——Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big-endian(大端序、大字節序、高字節序)方式存儲數據,而x86系列則采用little-endian(小端序、小字節序、低字節序)方式存儲數據。

  何為大端序和小端序?

  大端序:字數據的高字節存儲在低地址中。

  小端序:字數據的低字節存儲在低地址中。

  其實這兩個概念不難理解,但是比較容易記混。由於大端序和小端序都是從存儲器的低地址開始向高地址存儲數據,不同的是一個字數據中先存高字節還是先存低字節。可以記住這樣一個口訣:“高大低小”。“高”是指高字節,“大”是指大端序,“低”是指低字節,“小”是指小端序,“高大低小”也即先存高字節為大端序,先存低字節為小端序。

  舉個常見的例子。

  位寬為32bit的CPU,要存儲的字數據為0x1234abcd,起始地址為0x4000。

  大端序:

 地址   0x4000   0x4001   0x4002   0x4003 
 內容   0x12   0x34   0xab  0xcd

  小端序:

 地址   0x4000   0x4001   0x4002   0x4003 
 內容   0xcd   0xab  0x34   0x12

  以上是字節域中,比較容易理解。

  下面說一下在位域中。

  先看一個例子。

 1 typedef struct tagExp
 2 {
 3     WORD bit4:4;
 4     WORD bit3:3;
 5     WORD bit2:2;
 6     WORD bit7:7;
 7 } Example;
 8 
 9 union
10 {
11     Example tExp;
12     WORD result;
13 } Test;
14 
15 Test.tExp.bit4 = 10;
16 Test.tExp.bit3 = 5;
17 Test.tExp.bit2 = 1;
18 Test.tExp.bit7 = 8;

  Test.Result輸出是多少呢?

  答案是,在Intel CPU上得到的結果為0x10da,在MPC8560 CPU得到的結果為0xaa88。

  下面來分析一下。

  在Intel CPU中,采用的是little-endian,從存儲器的低字節開始存儲,在一個字節中,從低位開始存儲,低bit位存儲在低bit地址。也即

  (圖中,yellow-bit4,green-bit3,blue-bit2,white-bit7)

  在MCP8560 CPU中,采用的是big-endian,同樣從存儲器的低字節開始存儲,而在一個字節中,是從高位開始存儲,高bit位存儲在高bit地址。也即

  (圖中,yellow-bit4,green-bit3,blue-bit2,white-bit7)

  位域比字節域更深層了一步,是從bit的角度解釋了大端序和小端序。

  綜合起來,就是兩句話。

  高大低小:先存高字節為大端序,先存低字節為小端序。

  高高低低:大端序先把高bit位存儲在高位地址,小端序先把低bit位存儲在低位地址。

  最后附加一個常用的C程序來判斷是大端序還是小端序。

 1 bool checkCPU()
 2 {
 3     union 
 4     {
 5         int a ;
 6         char b ;
 7     } c;
 8  
 9     c.a = 1 ;
10  
11     return(c.b == 1)
12 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM