Big Endian 和 Little Endian的區別


  ARM體系中,每個字單元包含4個字節單元或者兩個半字單元。在字單元中,4個字節哪一個是高位字節,哪一個是低位字節則有兩種不同的格式:big-endian和little-endian格式。在小端模式中,低位字節放在低地址,高位字節放在高地址;在大端模式中,低位字節放在高地址,高位字節放在低地址。

   如果將一個32位的整數0x12345678(如用UltraEdit打開某個文件看到的第一行頭四個字節是:"00000000h:12 34 56 78")存放到一個整型變量(int)中,這個整型變量(文件內容)采用大端或者小端模式在內存中的存儲由下表所示。

  

地址偏移

大端模式

小端模式

0x00

12

78

0x01

34

56

0x02

56

34

0x03

78

12

對於文件內容 0x12345678,把前面("12")的看為高端字節,后面("78")的看為低端字節,那么可以使用"高高低低"(Little Endian),"高低高低"(Big Endian)的口訣。直觀的區分,如果發現內存的內容和文件的內容在順序上以4個字節顛倒,那么他就是Little Edian。實現Big Endian和Little Endian主要是由編譯器指定的,通常是在CCFLAG 加參數,如: -DENDIAN_LITTLE,設定編譯為小端字節。實際中用Trace 32可以用Memory Dump查看內存內容,和寫入文件比較后判斷為大端還是小端。

 

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

 

 

地址偏移

大端模式

小端模式

0x00

12

34

0x01

34

12

 

由上表所知,采用大小模式對數據進行存放的主要區別在於在存放的字節順序,大端方式將高位存放在低地址,小端方式將低位存放在低地址

 

  那么該如何判斷CPU是大端模式還是小端模式呢??

 

  在C語言中,聯合體union的存放順序是所有成員都從低地址開始存放的。利用這一特點,可以用聯合體變量判斷ARM或x86環境下,存儲系統是是大端還是小端模式。

  具體的代碼如下:

#include "stdio.h"
int main()
{
  union w
 {
  int a;  //4 bytes
  char b; //1 byte
 } c;
  c.a=1;
  if (c.b==1)
  printf("It is Little_endian!/n");
  else
  printf("It is Big_endian!/n");
  return 1;
}


免責聲明!

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



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