• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-4  評(píng)論-40  文章-117  trackbacks-0


            選擇自 jemmy 的 Blog  

              
                談到字節(jié)序的問題,必然牽涉到兩大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存儲(chǔ)數(shù)據(jù),而x86系列則采用little endian方式存儲(chǔ)數(shù)據(jù)。那么究竟什么是big endian(大端字節(jié)序),什么又是little endian(小端字節(jié)序)呢?

                 其實(shí)big endian是指低地址存放最高有效字節(jié)(MSB),而little endian則是低地址存放最低有效字節(jié)(LSB)。
                 用文字說明可能比較抽象,下面用圖像加以說明。比如數(shù)字0x12345678在兩種不同字節(jié)序CPU中的存儲(chǔ)順序如下所示:

            Big Endian

               低地址                                            高地址
               ----------------------------------------->
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
               |     12     |      34    |     56      |     78    |
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

            Little Endian

               低地址                                            高地址
               ----------------------------------------->
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
               |     78     |      56    |     34      |     12    |
               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

             

                 為什么要注意字節(jié)序的問題呢?你可能這么問。當(dāng)然,如果你寫的程序只在單機(jī)環(huán)境下面運(yùn)行,并且不和別人的程序打交道,那么你完全可以忽略字節(jié)序的存在。但是,如果你的程序要跟別人的程序產(chǎn)生交互呢?在這里我想說說兩種語(yǔ)言。C/C++語(yǔ)言編寫的程序里數(shù)據(jù)存儲(chǔ)順序是跟編譯平臺(tái)所在的CPU相關(guān)的,而JAVA編寫的程序則唯一采用big endian方式來存儲(chǔ)數(shù)據(jù)。試想,如果你用C/C++語(yǔ)言在x86平臺(tái)下編寫的程序跟別人的JAVA程序互通時(shí)會(huì)產(chǎn)生什么結(jié)果?就拿上面的0x12345678來說,你的程序傳遞給別人的一個(gè)數(shù)據(jù),將指向0x12345678的指針傳給了JAVA程序,由于JAVA采取big endian方式存儲(chǔ)數(shù)據(jù),很自然的它會(huì)將你的數(shù)據(jù)翻譯為0x78563412。什么?竟然變成另外一個(gè)數(shù)字了?是的,就是這種后果。因此,在你的C程序傳給JAVA程序之前有必要進(jìn)行字節(jié)序的轉(zhuǎn)換工作。

                 無獨(dú)有偶,所有網(wǎng)絡(luò)協(xié)議也都是采用big endian的方式來傳輸數(shù)據(jù)的。所以有時(shí)我們也會(huì)把big endian方式稱之為網(wǎng)絡(luò)字節(jié)序。當(dāng)兩臺(tái)采用不同字節(jié)序的主機(jī)通信時(shí),在發(fā)送數(shù)據(jù)之前都必須經(jīng)過字節(jié)序的轉(zhuǎn)換成為網(wǎng)絡(luò)字節(jié)序后再進(jìn)行傳輸。ANSI C中提供了下面四個(gè)轉(zhuǎn)換字節(jié)序的宏。


            big endian:最高字節(jié)在地址最低位,最低字節(jié)在地址最高位,依次排列。
            little endian:最低字節(jié)在最低位,最高字節(jié)在最高位,反序排列。

            endian指的是當(dāng)物理上的最小單元比邏輯上的最小單元小時(shí),邏輯到物理的單元排布關(guān)系。咱們接觸到的物理單元最小都是byte,在通信領(lǐng)域中,這里往往是bit,不過原理也是類似的。

            一個(gè)例子:
            如果我們將0x1234abcd寫入到以0x0000開始的內(nèi)存中,則結(jié)果為
                            big-endian     little-endian
            0x0000     0x12              0xcd
            0x0001     0x34              0xab
            0x0002     0xab              0x34
            0x0003     0xcd              0x12


            目前應(yīng)該little endian是主流,因?yàn)樵跀?shù)據(jù)類型轉(zhuǎn)換的時(shí)候(尤其是指針轉(zhuǎn)換)不用考慮地址問題。


             

            posted on 2009-07-09 14:31 李陽(yáng) 閱讀(162) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            国产精品狼人久久久久影院| 久久人人爽人人爽人人爽| 麻豆AV一区二区三区久久| 久久精品国产亚洲AV不卡| 久久婷婷五月综合97色| 国产免费福利体检区久久 | 久久久久久国产精品无码下载| 久久亚洲日韩看片无码| 亚洲综合精品香蕉久久网| 国产精品99精品久久免费| 久久九九久精品国产免费直播| 久久久久久无码国产精品中文字幕| www亚洲欲色成人久久精品| 国内精品久久久久影院老司| 人人狠狠综合久久88成人| 精品久久综合1区2区3区激情| 一本久久精品一区二区| 99久久久国产精品免费无卡顿| 国产精品美女久久久免费| 精品多毛少妇人妻AV免费久久| 久久av无码专区亚洲av桃花岛| 国产精品青草久久久久福利99| 欧美一区二区久久精品| 国产精品毛片久久久久久久| 久久亚洲精品无码VA大香大香| 一级做a爱片久久毛片| 亚洲一级Av无码毛片久久精品| 国产精品久久久久AV福利动漫| 久久久久国产精品三级网| www.久久精品| 久久棈精品久久久久久噜噜| 欧美精品国产综合久久| 久久久久夜夜夜精品国产| 国产69精品久久久久9999APGF| 青青热久久国产久精品 | 久久人人爽人人爽人人片AV不| 精品欧美一区二区三区久久久| 久久久国产亚洲精品| 久久久久一本毛久久久| 狠狠色婷婷综合天天久久丁香| 精品久久久久中文字幕日本|