記憶體的位元組儲存大小端問題(二)

2021-06-18 10:23:59 字數 2087 閱讀 5111

大端和小端(網路位元組序和主機位元組序):

大端(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...