也談大端模式(big endian)和小端模式(little endian) (一) 引 子

來源:互聯網
上載者:User

    以32位機來講,比如有這樣一個整形數0x11223344,假設從記憶體0x0地址開始存放這個數。

    對於大端模式(Big endian),低地址存放高位元組。所以0x11223344在記憶體中的存放如下:

    0x00:0x11

    0x01:0x22

    0x02:0x33

    0x03:0x44

    而對於小端模式(Little endian),低地址存放低位元組。所以0x11223344在記憶體中的存放和大端是相反的:

    0x00:0x44

    0x01:0x33

    0x02:0x22

    0x03:0x11

    相信大家對這個知識點都比較熟悉,不過稍微想想,馬上又會覺得幹嘛要弄兩種不同順序的存放方式呢?(遵循不講故事只講事實的原則,這裡不再贅述其來由) 

    容易想到的問題是:存放方式不同,讀取出來的時候會不會出錯呢?讀取一個位元組得到的值是什嗎?讀取兩個位元組呢?讀取四個位元組呢?

    首先,變數的地址都是變數存放的低地址,不論大端還是小端,如果有int ByteOrder= 0x11223344,我們假設變數ByteOrder在記憶體中的地址為0x00,那麼不論讀取一個位元組還是四個位元組,都會從記憶體的0x00地址處開始讀取。

    大端模式:一次讀取四個位元組,很顯然我們取回來的是數應該是0x11223344。取兩個位元組(我們可以這樣寫代碼:short b = (*(short *)&ByteOrder),再列印b的值就成了):0x1122。取一個位元組:0x11。

    小端模式:同樣一次讀取四個位元組,我們得到的肯定也是0x11223344。而讀取兩位元組:0x3344。取一個位元組:0x44。

    所以現在擺在我們面前的主要有兩個問題:

    1. 取一個/兩個位元組的時候,大小端取出來的值不同,但是當按四個位元組取出來的時候,又相同了,這是為什麼呢?

    2.上面是用指標的方式取值的,如果改成強制轉換,比如short b = (short)ByteOrder,值又是什麼呢? 

   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.