• <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  評論-40  文章-117  trackbacks-0


            選擇自 jemmy 的 Blog  

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

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

            Big Endian

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

            Little Endian

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

             

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

                 無獨有偶,所有網絡協議也都是采用big endian的方式來傳輸數據的。所以有時我們也會把big endian方式稱之為網絡字節序。當兩臺采用不同字節序的主機通信時,在發送數據之前都必須經過字節序的轉換成為網絡字節序后再進行傳輸。ANSI C中提供了下面四個轉換字節序的宏。


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

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

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


            目前應該little endian是主流,因為在數據類型轉換的時候(尤其是指針轉換)不用考慮地址問題。


             

            posted on 2009-07-09 14:31 李陽 閱讀(166) 評論(0)  編輯 收藏 引用
            久久久久亚洲av毛片大| 精品无码久久久久久午夜| 日日躁夜夜躁狠狠久久AV| 久久婷婷午色综合夜啪| 久久精品国产亚洲一区二区三区 | 精品欧美一区二区三区久久久| 91精品日韩人妻无码久久不卡| 久久99精品国产一区二区三区| 国内精品久久久久国产盗摄| 免费精品国产日韩热久久| 色综合久久天天综线观看| 色欲av伊人久久大香线蕉影院| 久久91精品国产91久久小草| 久久99热这里只有精品国产 | 久久精品夜色噜噜亚洲A∨| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 久久精品九九亚洲精品| 一本大道久久香蕉成人网| 亚州日韩精品专区久久久| 久久久99精品成人片中文字幕| 久久激情亚洲精品无码?V| 久久精品国产亚洲精品| 国产婷婷成人久久Av免费高清| 综合久久一区二区三区| 亚洲伊人久久大香线蕉综合图片| 久久精品中文騷妇女内射| 久久九九全国免费| 99久久精品无码一区二区毛片| 久久天天日天天操综合伊人av| 久久精品中文无码资源站| 久久AⅤ人妻少妇嫩草影院| 亚洲精品国产美女久久久| 久久99热这里只有精品国产| 久久精品国产一区二区三区日韩| 久久国产美女免费观看精品| 色偷偷888欧美精品久久久| 久久综合欧美成人| 色综合久久综合网观看| 久久国产精品无| 久久精品国产亚洲AV影院| 久久福利片|