高位字節、低位字節


一般一個16位(雙字節)的數據,比如 FF1A  (16進制)
那么高位字節就是FF,低位是1A

如果是32位的數據,比如  3F68415B
高位字(不是字節)是3F68
低位字是415B

右邊是低位位,左邊是高位

C語言中的高位字節和低位字節是什么意思?

通常從最高有效位開始自左向右書寫一個數字。在理解有效位這個概念時,可以想象一下你的支票數額的第一位增加1和最后一位增加1之間的巨大區別,前者肯定會讓你喜出望外。

計算機內存中一個字節的位相當於二進制數的位,這意味着最低有效位表示1,倒數第二個有效位表示2×1或2,倒數第三個有效位表示2×2×1或4,依此類推。如果用內存中的兩個字節表示一個16位的數,那么其中的一個字節將存放最低的8位有效位,而另一個字節將存放最高的8位有效位,見圖。存放最低的8位有效位的字節被稱為最低有效位字節或低位字節,而存放最高的8位有效位的字節被稱為最高有效位字節或高位字節。

16位和32位的數是怎么存儲的?

一個16位的數占兩個字節的存儲空間,即高位字節和低位字節(見上圖)。如果是在紙上書寫一個16位的數,你總是會把高位字節寫在前面,而把低位字節寫在后面。然而,當這個數被存儲到內存中時,並沒有固定的存儲順序

如果用M和L分別表示高位字節和低位字節,那么可以有兩種方式把這兩個字節存儲到內存中,即M在前L在后或者L在前M在后。把M存儲在前的順序被稱為“正向(forward)”或“高位優先順序;把L存儲在前的順序被稱為“逆向”或“低位優先”順序。

大多數計算機按正向順序存儲一個數,Intel CPU按逆向順序存儲一個數,因此,如果試圖將基於Intel CPU的計算機連到其它類型的計算機上,就可能會引起混亂。

一個32位的數占4個字節的存儲空間,如果我們按有效位從高到低的順序,分別用Mm,Ml,Lm和Ll表示這4個字節,那么可以有4!(4的階乘,即24)種方式來存儲這些字節。在過去的這些年中,人們在設計計算機時,幾乎用遍了這24種方式。然而,時至今天,只有兩種方式是最流行的,一種是(Mm,MI,Lm,LD,也就是高位優先順序,另一種是(Ll,Lm,Ml,Mm),也就是低位優先順序。和存儲16位的數一樣,大多數計算機按高位優先順序存儲32位的數,但基於Intel CPU的計算機按低位優先順序存儲32位的數。

Socket相關知識點

網絡字節序與主機字節序

主機字節序:就是我們平常說的大端和小端模式:不同的CPU有不同的字節序類型,這些字節序是指整數在內存中保存的順序,這個叫做主機序。引用標准的Big-Endian和Little-Endian的定義如下:

  a) Little-Endian就是低位字節排放在內存的低地址端,高位字節排放在內存的高地址端。

  b) Big-Endian就是高位字節排放在內存的低地址端,低位字節排放在內存的高地址端。

網絡字節序:4個字節的32 bit值以下面的次序傳輸:首先是0~7bit,其次8~15bit,然后16~23bit,最后是24~31bit。這種傳輸次序稱作大端字節序。由於TCP/IP首部中所有的二進制整數在網絡中傳輸時都要求以這種次序,因此它又稱作網絡字節序。字節序,顧名思義字節的順序,就是大於一個字節類型的數據在內存中的存放順序,一個字節的數據沒有順序的問題了。所以:在將一個地址綁定到socket的時候,請先將主機字節序轉換成為網絡字節序,而不要假定主機字節序跟網絡字節序一樣使用的是Big-Endian。

為什么會有大小端模式之分呢?

這是因為在計算機系統中,我們是以字節為單位的,每個地址單元都對應着一個字節,一個字節為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於寄存器寬度大於一個字節,那么必然存在着一個如果將多個字節安排的問題。因此就導致了大端存儲模式和小端存儲模式。例如一個16bit的short型x,在內存中的地址為0x0010,x的值為0x1122,那么0x11為高字節,0x22為低字節。對於大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM