1. 程式人生 > >深入瞭解MSB和LSB

深入瞭解MSB和LSB

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從而發生混亂。

相關推薦

深入瞭解MSBLSB

Most Significant Bit, Last(Least) Significant Bit 最高有效位(MSB) 指二進位制中最高值的位元。在16位元的數字音訊中,其第1個位元便對16bit的字的數值有最大的影響。例如,在十 進位制的15,389這一數字中,相當於

MSBLSB,建議先看下面(其實就是大小端的問題)

轉自 https://blog.csdn.net/u010893262/article/details/52875068/ 最高有效位(MSB)  指二進位制中最高值的位元。在16位元的數字音訊中,其第1個位元便對16bit的字的數值有最大的影響。例如,在十進位制的15,38

交叉編譯 MSB LSB 問題

                                                                    MIPS平臺gcc交叉編譯MSB和LSB問題     最近在做mips平臺的工作,在交叉編譯軟體包的時候發現的問題現在記錄下來,當我們用l

關於MSBLSB的C語言操作

一串二進位制數從左往右數,最高位為MSB,最右為LSB;我們知道一個data是有unsigned和signed之分,以及32位或是64位等區別。這裡我以16位的有符號位二進位制數為例,用C語言實際操作一串二進位制數的有效位,實現MSB與LSB的排序的調換。 #include

MSB LSB是個啥玩意

MSB:最高有效bit位 LSB:最低有效bit位 之前寫的大小端只是說了一下一個word在四個位元組中是怎麼排列的,實際的儲存中,一個位元組內也是有bit序的,這個暫時先貼個連結,我正在看VMSA,沒時間鑽這個: http://blog.chinaunix.net/ui

深入瞭解gradlemaven的區別

[toc] 深入瞭解gradle和maven的區別 # 簡介 gradle和maven都可以用來構建java程式,甚至在某些情況下,兩者還可以互相轉換,那麼他們兩個的共同點和不同點是什麼?我們如何在專案中選擇使用哪種技術呢?一起來看看吧。 # gradle和maven的比較 雖然gradle和mav

深入瞭解new的過程,call,apply,bind的區別

話不多數,直接上程式碼 1 //1、new的過程發生了什麼 2 function create () { 3 //建立了一個物件 4 var obj = new Object() 5 //獲取建構函式 6

#Java乾貨分享:一篇文章讓你深入瞭解Java中的包介面

很多新手程式設計師對於Java中兩個具創新性的特徵————包與介面不是非常清楚,所以我特意發了這篇文章來闡述什麼是包,什麼是介面。 包(package)是多個類的容器,它們用於保持類的名稱空間相互隔離。 如果有想學習java的程式設計師,可來我們的java學習扣qun:79979,2590免

深入瞭解計算機系統》筆記——組合語言機器語言

組合語言和機器語言 我們不需要完全瞭解掌握機器語言、組合語言來進行程式設計(這是計算機生產廠家要做的事)。我們所要知道的是如何看懂組合語言就行了。我們所編寫的高階語言,被翻譯成組合語言時,編譯器會自動進行一些優化處理。 機器語言 計算機是不能直接識別我們所編寫的C程式或者Java

深入瞭解探索資料庫的悲觀鎖樂觀鎖

 在資料庫的鎖機制中介紹過,資料庫管理系統(DBMS)中的併發控制的任務是確保在多個事務同時存取資料庫中同一資料時不破壞事務的隔離性和統一性以及資料庫的統一性。 樂觀併發控制(樂觀鎖)和悲觀併發控制(悲觀鎖)是併發控制主要採用的技術手段。 無論是悲觀鎖還是樂觀鎖,都是人們定義出來

深入瞭解CSS字型度量,行高vertical-align

本文英文出處:http: //iamvdo.me/en/blog/css-font-metrics-line-height-and-vertical-align 著作權歸作者所有。 轉載自https: //www.w3cplus.com/css/css-font-metrics-l

深入瞭解Office 2016 for Mac的定製、安配置啟用

更新:    2016-02-16: 更新到版本15.19.1, 官方升級說明:https://support.microsoft.com/en-us/kb/3134241 寫在前面 隨著微軟釋出了Office 2016版本,已經有越來越多的使用者遷移到了2016版,

深入瞭解.NET中繼承多型(下)

很久都沒寫BLGO了,關於多型的第3篇文章一晃就1年了才寫。有時比較迷茫,感覺太多東西都要學,什麼都想學,卻找不清方向了。呵呵,看著好多牛人的BLOG覺得自己水平實在是太差了。呵呵。有時甚至覺得自己寫的東西太低階了。呵呵,或許是自己抱怨太多了,還是靜下心來慢慢學習吧。以後一

深入瞭解scanf()/getchar()gets()等函式

cin<<, cin.get,cin.getline等函式深入分析 很多初學者都認為cin函式是一個很簡單的函式,其實不然!cin函式有很多需要了解的知識(比如:cin的返回值是什麼,cin提供了哪些成員函式且分別是什麼作用,如cin.clear(),  cin.ignore(), cin.fa

深入瞭解String,StringBufferStringBuilder三個類的異同

Java提供了三個類,用於處理字串,分別是String、StringBuffer和StringBuilder。其中StringBuilder是jdk1.5才引入的。 這三個類有什麼區別呢?他們的使用場景分別是什麼呢? 本文的程式碼是在jdk12上執行的,jdk12和jdk5,jdk8有很大的區別,特別是Str

讀Hadoop3.2原始碼,深入瞭解java呼叫HDFS的常用操作HDFS原理

> 本文將通過一個演示工程來快速上手java呼叫HDFS的常見操作。接下來以建立檔案為例,通過閱讀HDFS的原始碼,一步步展開HDFS相關原理、理論知識的說明。 > 說明:本文件基於最新版本Hadoop3.2.1 # 目錄 ### 一、java呼叫HDFS的常見操作 #### 1.1、演示環境搭

OpenStack實踐系列⑦深入理解neutron虛擬機

ice 賬號 由器 1.0 鏡像 多租戶 ridge 不同的 img OpenStack實踐系列⑦深入理解neutron和虛擬機 五、深入理解Neutron 5.1 虛擬機網卡和網橋 [[email protected]/* */ ~]# ifconfig

深入.NET平臺C#編程筆記 第九章 文件操作

let 目錄 edi 保存 過程 相對 writer .net 文本 第九章 文件操作 01.持久化: 是將程序數據在持久狀態和瞬時狀態間轉換的機制。通俗的講,就是瞬時數據(比如內存中的數據,是不能永久保存的)持久化為持久數據(比如持久化至數據庫中,能夠長久保存)。

深入.NET平臺C#編程筆記第三章

哈希 是你 存儲 key pac 問題 所有 try 編譯 第三章 使用集合組織相關數據 1.集合概念引入 集合:某些指定的對象(SE)集中在一起就是集合 如下是一個Hello Kitty的集合 數組:可以存儲相同數據類型的一堆數據的容器 2.集合Arr

深入.NET平臺C#編程筆記第二章

數據的操作 數據類型 面向 封裝 nbsp 分割 一個數 信息隱藏 [0 第二章 深入C#數據類型 1.封裝 .封裝又稱信息隱藏,是指利用抽象數據類型(自定義類)將數據和數據的操作結合在一起,使其構成一個不可分割的獨立實體,盡可能的隱藏內部的細節,只保留一些對外接口,使之於