音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

ARM存儲格式之大端小端

出處:維庫電子市場網(wǎng) 發(fā)布于:2016-08-15 15:36:25

   開頭講個有關(guān) 大端小端的故事:

  端模式(Endian)的這個詞出自Jonathan Swift書寫的《格列佛游記》。這本書根據(jù)將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為Big Endian,從尖頭開始將雞蛋敲開的人被歸為Littile Endian。小人國的內(nèi)戰(zhàn)就源于吃雞蛋時是究竟從大頭(Big-Endian)敲開還是從小頭(Little-Endian)敲開。在計算機業(yè)Big Endian和Little Endian也幾乎引起一場戰(zhàn)爭。

  我們知道在內(nèi)存中數(shù)據(jù)是以字節(jié)為單位進行存儲的,每個地址單元對應(yīng)著一個字節(jié)(byte),一個字節(jié)為8位(bite)。但是很多時候數(shù)據(jù)除了8bit額char外,還有16bit的short,32位的long型(要看具體的編譯器),必然存在多字節(jié)安排的問題。不同的計算機存放多字節(jié)值的順序不同,有些機器在起始地址存放低位字節(jié)(低位先存),即小端模式;有的機器在起始地址存放高位字節(jié)(高位先存),即大端模式。基于Intel的CPU,采用的是低位先存。而KEIL C51則為大端模式。大端小端對應(yīng)著數(shù)據(jù)在存儲器中的存放順序。

  同時,在網(wǎng)絡(luò)傳輸中,網(wǎng)絡(luò)協(xié)議需要指定網(wǎng)絡(luò)字節(jié)順序,TCP/IP協(xié)議中使用16位整數(shù)和32位整數(shù)的高位先存模式,對應(yīng)我們的大端模式。

  下面是兩個具體例子:

  16bit寬的數(shù)0x1234在Little-endian模式(以及Big-endian模式)CPU內(nèi)存中的存放方式(假設(shè)從地址0x4000開始存放)為:

ARM存儲格式之大端小端

  32bit寬的數(shù)0x12345678在Little-endian模式以及Big-endian模式)CPU內(nèi)存中的存放方式(假設(shè)從地址0x4000開始存放)為:

ARM存儲格式之大端小端

  聯(lián)合體union的存放順序是所有成員都從低地址開始存放,利用該特性可以輕松地獲得了CPU對內(nèi)存采用Little-endian還是Big-endian模式讀寫。

  寫程序判斷處理器是Little-endian模式,還是Big-endian模式,可以通過以下程序:

  1、通過將int強制類型轉(zhuǎn)換成char單字節(jié),通過判斷起始存儲位置。

  1 void main(int argc, char **argv)

  2 {

  3 int i = 1;

  4 char *cp = (char *)&i; //前面是指針運算符*,前值類型轉(zhuǎn)換。后面是取地址符號。

  5 if (*cp) //如果此時cp指向的內(nèi)存為1的話,則為小端,否則為大端。

  6 printf("Little Endian\n");

  7 else

  8 printf("Big Endian\n");

  9

  10 exit(EXIT_SUCCESS);

  11 }

  注釋:如果小端方式中(i占至少兩個字節(jié)的長度)則i所分配的內(nèi)存地址那個字節(jié)中就存著1,其他字節(jié)是0.大端的話則1在i的地址字節(jié)處存放,char是一個字節(jié),所以強制將char型量p指向i則p指向的一定是i的地址,那么就可以判斷p中的值是不是1(或者為0,也即是假)來確定是不是小端。

或者如下程序:

  void main()

  {

  short int x;

  char x0,x1;

  x=0x1122;

  x0=((char*)&x)[0]; //低地址單元

  x1=((char*)&x)[1]; //高地址單元

  if (0x11 == x0 && 0x22 == x1)

  {

  cout << "Big_endian" << endl;

  }

  else

  {

  cout << "Little_endian" << endl;

  }

  }

  2、利用聯(lián)合體union的存放順序是所有成員都從低地址開始存放,判斷處理器模式。

  bool checkCPU( )

  {

  {

  union w

  {

  int a;

  char b;

  } c;

  c.a = 1;

  return(c.b ==1);

  }

  }

  以及如下程序:

  bool isLittleEndian()

  {

  union _dword

  {

  int all;

  struct _bytes

  {

  char byte0;

  char pad[3];

  }bytes;

  }dword;

  dword.all=0x87654321;

  return (0x21==dword.bytes.byte0);

  }

  分析:如果你的處理器調(diào)用函數(shù)isLittleEndian返回1,那么說明你的處理器為little endian,否則為big endian.注意,如果在little endian處理器上,byte0和pad按內(nèi)存從低到高的存放順序:LOW->byte0 pad[0] pad[1] pad[2] ->HIGH;0x87654321按內(nèi)存從低到高的存放順序: 0x21 0x43 0x65 0x87, 可見byte0對應(yīng)到0x21。所以通過判斷dword中個字節(jié)dword.bytes.byte0是否與0x21相等就可以看出是否是little endian。

 

關(guān)鍵詞:ARM存儲格式之大端小端

版權(quán)與免責(zé)聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責(zé)任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

廣告
OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務(wù):
賣家服務(wù):
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務(wù)的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!