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開始存放)為:
32bit寬的數(shù)0x12345678在Little-endian模式以及Big-endian模式)CPU內(nèi)存中的存放方式(假設(shè)從地址0x4000開始存放)為:
聯(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。
上一篇:RS-485的手拉手連接方案
下一篇:嵌入式JTAG接口解讀
版權(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)利。
- ARM技術(shù)架構(gòu)與應(yīng)用開發(fā)實踐指南2026/1/6 10:40:19
- 嵌入式實時操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計實踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識2025/7/14 16:59:04









