1. 程式人生 > >LSB最低有效位和MSB最高有效位

LSB最低有效位和MSB最高有效位

最低有效位the least significant bitlsb)是指一個二進位制數字中的第0位(即最低位),具有權值為2^0,可以用它來檢測數的奇偶性。與之相反的稱之為最高有效位。在大端序中,lsb指最右邊的位。

圖1 無符號數149的二進位制形式,藍色為最高有效位

   最低有效位代表二進位制數中的最小的單位,可以用來指示數字很小的變化。

   LSB(全大寫)有時也指Least Significant Byte,指多位元組序列中最小權重的位元組。

   最高有效位the Most Significant Bitmsb

),是指一個n位二進位制數字中的n-1位,具有最高的權值2^n − 1。與之相反的稱之為最低有效位。在大端序中,msb即指最左端的位。

圖2 無符號數149的二進位制形式,藍色為最高有效位

    對於有符號二進位制數,負數採用反碼或補碼形式,此時msb用來表示符號,msb為1表示負數,0表示正數。

    MSB(全大寫)有時也指the Most Significant Byte,指多位元組序列中具有最大權重的位元組。

參考資料:維基百科

-================================================

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,

[email protected]#$%^&*,見鬼去吧 -_-|||      為什麼要注意位元組序的問題呢?你可能這麼問。當然,如果你寫的程式只在單機環境下面執行,並且不和別人的程式打交道,那麼你完全可以忽略位元組序的存在。但是,如果你的程式要跟別人的程式產生互動呢?在這裡我想說說兩種語言。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從而發生混亂。