在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM存儲(chǔ)格式之 大端小端

            ARM存儲(chǔ)格式之 大端小端

            作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
            開(kāi)頭講個(gè)有關(guān)大端小端的故事:

              端模式(Endian)的這個(gè)詞出自Jonathan Swift書(shū)寫(xiě)的《格列佛游記》。這本書(shū)根據(jù)將雞蛋敲開(kāi)的方法不同將所有的人分為兩類(lèi),從圓頭開(kāi)始將雞蛋敲開(kāi)的人被歸為Big Endian,從尖頭開(kāi)始將雞蛋敲開(kāi)的人被歸為L(zhǎng)ittile Endian。小人國(guó)的內(nèi)戰(zhàn)就源于吃雞蛋時(shí)是究竟從大頭(Big-Endian)敲開(kāi)還是從小頭(Little-Endian)敲開(kāi)。在計(jì)算機(jī)業(yè)Big Endian和Little Endian也幾乎引起一場(chǎng)戰(zhàn)爭(zhēng)?! ?/p>本文引用地址:http://www.biyoush.com/article/201611/316677.htm

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

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

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

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

            內(nèi)存地址小端模式存放內(nèi)容大端模式存放內(nèi)容
            0x40000x340x12
            0x40010x120x34

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

            內(nèi)存地址小端模式存放內(nèi)容大端模式存放內(nèi)容
            0x40000x780x12
            0x40010x560x34
            0x40020x340x56
            0x40030x120x78

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

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

              1>.通過(guò)將int強(qiáng)制類(lèi)型轉(zhuǎn)換成char單字節(jié),通過(guò)判斷起始存儲(chǔ)位置。

            1voidmain(intargc,char**argv)
            2{
            3inti=1;
            4char*cp=(char*)&i;//前面是指針運(yùn)算符*,前值類(lèi)型轉(zhuǎn)換。后面是取地址符號(hào)。
            5if(*cp)//如果此時(shí)cp指向的內(nèi)存為1的話,則為小端,否則為大端。
            6printf("Little Endiann");
            7else
            8printf("Big Endiann");
            9
            10exit(EXIT_SUCCESS);
            11}

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

            或者如下程序:

            voidmain()
            {
            shortintx;

            charx0,x1;

            x=0x1122;

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

            if(0x11==x0&&0x22==x1)
            {
            cout<<"Big_endian"<}
            else
            {
            cout<<"Little_endian"<}
            }

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

            boolcheckCPU( )
            {
            {
            union w
            {
            inta;
            charb;

            } c;
            c.a=1;
            return(c.b==1);
            }
            }

            以及如下程序:

            boolisLittleEndian()
            {
            union _dword
            {
            intall;
            struct_bytes
            {
            charbyte0;
            charpad[3];
            }bytes;
            }dword;

            dword.all=0x87654321;

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

            分析:如果你的處理器調(diào)用函數(shù)isLittleEndian返回1,那么說(shuō)明你的處理器為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, 可見(jiàn)byte0對(duì)應(yīng)到0x21。所以通過(guò)判斷dword中第一個(gè)字節(jié)dword.bytes.byte0是否與0x21相等就可以看出是否是little endian。

             PS:本文后面幾個(gè)程序都是從網(wǎng)上摘抄過(guò)來(lái)的,對(duì)于聯(lián)合體Union不是很清楚的可以參看http://blog.sina.com.cn/s/blog_3fa943920100ob37.html我覺(jué)得這篇博文寫(xiě)的很詳細(xì)。通過(guò)本文對(duì)大端小端模式有了一個(gè)比較深的理解吧。也希望對(duì)讀者有些許幫助,謝謝!接下來(lái)我會(huì)總結(jié)下聯(lián)合Union結(jié)構(gòu)和Struct的區(qū)別。



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

            評(píng)論


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

            關(guān)閉