大端和小端(網路位元組序和主機位元組序):
大端(big endian):即網路位元組序。
小端(littile endian):即主機位元組序。
記憶方式:
網路的範圍很大,所以大端是網路位元組序。
大端方式將高位位元組存放在起始位址,小端方式將低位位元組存放在起始位址。
採用大端方式進行資料存放符合人類的正常思維(如我們手寫乙個數字一樣,起筆都是從高位資料先寫),而採用小端方式進行資料存放利於計算機處理。
例如乙個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。
對於 大端模式,就將0x11放在低位址中,即0x0010中,0x22放在高位址中,即0x0011中。
小端模式,則剛好相反。
注意:位元組的大端序還是小端序是由cpu決定的。
我們常用的x86結構是小端模式,而keil c51則為大端模式。很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。
網路位元組序:就是大端位元組序。規定不同系統間通訊一律採用網路位元組序。
如果將乙個32位的整數0x12345678存放到乙個整型變數(int)中,這個整型變數採用大端或者小端模式在記憶體中的儲存由下表所示。
為簡單起見,本書使用op0表示乙個32位資料的最高位元組msb(most significant byte),使用op3表示乙個32位資料最低位元組lsb(least significant byte)。
---------------------------
位址偏移 大端模式 小端模式
0x00
12(op0) 78(op3)
0x01
34(op1) 56(op2)
0x02
56(op2) 34(op1)
0x03
78(op3) 12(op0)
---------------------------
如果將乙個16位的整數0x1234存放到乙個短整型變數(short)中。這個短整型變數在記憶體中的儲存在大小端模式由下表所示。
---------------------------------
位址偏移 大端模式 小端模式
0x00
12(op0) 34(op1)
0x01
34(op1) 12(op0)
-------------------------------------
不同的cpu上執行不同的作業系統,位元組序也是不同的,參見下表。
處理器
作業系統
位元組排序
alpha
全部 little endian
hp-pa
nt little endian
hp-pa
unix
big endian
intelx86
全部 little endian <-----x86系統是小端位元組序系統
motorola680x() 全部
big endian
mips
nt little endian
mips
unix
big endian
powerpc
nt little endian
powerpc
非nt
big endian
<-----ppc系統是大端位元組序系統
rs/6000
unix
big endian
sparc
unix
big endian
ixp1200 arm核心
全部 little endian
記憶體的位元組儲存大小端問題(一)
記憶體大小端判斷 思路 聯合體union的存放順序是所有成員都從低位址開始存放,利用該特性就可以輕鬆地獲得了 cpu對記憶體是採用little endian還是big endian模式讀寫。給出c linux其實也差不了多少 include using namespace std union jud...
大小端問題 多位元組物件的儲存規則
在幾乎所有的機器上,多位元組物件都被儲存為連續的位元組序列,物件的位址為所使用位元組中最小的位址。例子 假設乙個型別為 int 的變數 x 的位址為 0x100,也就是說,位址表示式 x 的值為 0x100。那麼,假設資料型別 int 為32位表示 x 的 4 個位元組將被儲存在記憶體的 0x100...
大小端,位元組序問題
總結 1 80x86使用小端法,網路位元組序使用大端法。2 二進位制的網路程式設計中,傳送資料,最好以unsigned char,unsigned short,unsigned int 來處理,unsigned short unsigned short 以網路位元組序處理後再拷貝到傳送的buffer...