深入瞭解MSB和LSB

來源:互聯網
上載者:User

Most Significant Bit, Last(Least) Significant Bit

最高有效位(MSB)
指二進位中最高值的位元。在16位元的數字音頻中,其第1個位元便對16bit的字的數值有最大的影響。例如,在十
進位的15,389這一數字中,相當於萬數那1行(1)的數字便對數值的影響最大。比較與之相反的“最低有效位”(LSB)。
MSB高位前
導,LSB低位前置。

談到位元組序的問題,必然牽涉到兩大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相關的,而J***A編寫的程式則唯一採用big endian方式來儲存資料。試想,如果你用C/C++語言在x86平台下
編寫的程式跟別人的J***A程式互連時會產生什麼結果?就拿上面的0x12345678來說,你的程式傳遞給別人的一個資料,將指向
0x12345678的指標傳給了J***A程式,由於J***A採取big endian方式儲存資料,很自然的它會將你的資料翻譯為
0x78563412。什嗎?竟然變成另外一個數字了?是的,就是這種後果。因此,在你的C程式傳給J***A程式之前有必要進行位元組序的轉換工作。

     無
專屬偶,所有網路通訊協定也都是採用big endian的方式來傳輸資料的。所以有時我們也會把big endian方式稱之為網路位元組序。當兩台採用不同
位元組序的主機通訊時,在發送資料之前都必須經過位元組序的轉換成為網路位元組序後再進行傳輸。ANSI C中提供了下面四個轉換位元組序的宏。
·BE和
LE一文的補完

我在8月9號的《Big Endian和Little Endian》一文中談了位元組序的問題,原文見上面的超級連結。可
是有朋友仍然會問,CPU儲存一個位元組的資料時其位元組內的8個位元之間的順序是否也有big endian和little endian之分?或者說是否
有位元序的不同? 

     實際上,這個位元序是同樣存在的。下面以數字0xB4(10110100)用圖加以說明。 

Big Endian

   msb                                                         lsb
   ---------------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   1  |   0  |   1  |   1  |   0  |   1  |   0  |   0  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian

   lsb                                                         msb
   ---------------------------------------------->
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |   0  |   0  |   1  |   0  |   1  |   1  |   0  |   1  |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

     實
際上,由於CPU儲存資料操作的最小單位是一個位元組,其內部的位元序是什麼樣對我們的程式來說是一個黑盒子。也就是說,你給我一個指向0xB4這個數的指
針,對於big endian方式的CPU來說,它是從左往右依次讀取這個數的8個位元;而對於little endian方式的CPU來說,則正好相
反,是從右往左依次讀取這個數的8個位元。而我們的程式通過這個指標訪問後得到的數就是0xB4,位元組內部的位元序對於程式來說是不可見的,其實這點對於
單機上的位元組序來說也是一樣的。 

     那可能有人又會問,如果是網路傳輸呢?會不會出問題?是不是也要通過什麼函數轉換一下位元
序?嗯,這個問題提得很好。假設little endian方式的CPU要傳給big endian方式CPU一個位元組的話,其本身在傳輸之前會在本地就
讀出這個8位元的數,然後再按照網路位元組序的順序來傳輸這8個位元,這樣的話到了接收端不會出現任何問題。而假如要傳輸一個32位元的數的話,由於這個數
在littel endian方儲存時佔了4個位元組,而網路傳輸是以位元組為單位進行的,little endian方的CPU讀出第一個位元組後發送,實際
上這個位元組是原數的LSB,到了接收方反倒成了MSB從而發生混亂。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.