奇葛格的BLOG

          紅塵最可笑,我自樂逍遙

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            59 隨筆 :: 23 文章 :: 11 評論 :: 0 Trackbacks
          Big Endian and Little Endian

          ? ? 談到字節序的問題,必然牽涉到兩大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 ? ?|
          ? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

          ? ? 從上面兩圖可以看出,采用big endian方式存儲數據是符合我們人類的思維習慣的。而little endian,!@#$%^&*,見鬼去吧 -_-|||

          ? ? 為什么要注意字節序的問題呢?你可能這么問。當然,如果你寫的程序只在單機環境下面運行,并且不和別人的程序打交道,那么你完全可以忽略字節序的存在。但 是,如果你的程序要跟別人的程序產生交互呢?尤其是當你把你在微機上運算的結果運用到計算機群上去的話。在這里我想說說兩種語言。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中提供了四個轉換字節序的宏。
          posted on 2006-08-01 12:02 奇葛格 閱讀(330) 評論(0)  編輯  收藏 所屬分類: 程序基礎知識

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 开化县| 天门市| 武义县| 大理市| 米易县| 宾川县| 时尚| 乌拉特前旗| 香港| 孟州市| 宽甸| 贵南县| 库伦旗| 建瓯市| 宿松县| 大田县| 南安市| 扬州市| 汶上县| 钟山县| 兰考县| 繁昌县| 元氏县| 师宗县| 莆田市| 肃南| 郴州市| 宁波市| 镶黄旗| 岳阳县| 鄂托克前旗| 灵寿县| 旌德县| 田东县| 布尔津县| 海盐县| 德州市| 桑日县| 西宁市| 肃宁县| 中超|