<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 模擬技術(shù) > 設計應用 > ARM存儲格式之大端小端

ARM存儲格式之大端小端

作者: 時(shí)間:2018-08-06 來(lái)源:網(wǎng)絡(luò ) 收藏

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

本文引用地址:http://dyxdggzs.com/article/201808/385422.htm

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

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

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

下面是兩個(gè)具體例子:

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

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

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

寫(xiě)程序判斷處理器是Little-endian模式,還是Big-endian模式,可以通過(guò)以下程序:

1、通過(guò)將int強制類(lèi)型轉換成char單字節,通過(guò)判斷起始存儲位置。

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

2 {

3 int i = 1;

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

5 if (*cp) //如果此時(shí)cp指向的內存為1的話(huà),則為小端,否則為大端。

6 printf(Little Endiann);

7 else

8 printf(Big Endiann);

9

10 exit(EXIT_SUCCESS);

11 }

注釋?zhuān)喝绻《朔绞街?i占至少兩個(gè)字節的長(cháng)度)則i所分配的內存最小地址那個(gè)字節中就存著(zhù)1,其他字節是0.大端的話(huà)則1在i的最高地址字節處存放,char是一個(gè)字節,所以強制將char型量p指向i則p指向的一定是i的最低地址,那么就可以判斷p中的值是不是1(或者為0,也即是假)來(lái)確定是不是小端。

或者如下程序:

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的存放順序是所有成員都從低地址開(kāi)始存放,判斷處理器模式。

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);

}

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



關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>