大端序與小端序 位元組序與位域的儲存

2022-05-15 07:33:12 字數 1799 閱讀 4059

談到位元組序的問題,必然牽涉到兩大cpu派系——motorola的powerpc系列cpu和intel的x86系列cpu。powerpc系列採用big-endian(大端序、大字節序、高位元組序)方式儲存資料,而x86系列則採用little-endian(小端序、小字節序、低位元組序)方式儲存資料。

何為大端序和小端序?

其實這兩個概念不難理解,但是比較容易記混。由於大端序和小端序都是從儲存器的低位址開始向高位址儲存資料,不同的是乙個字資料中先存高位元組還是先存低位元組。可以記住這樣乙個口訣:「高大低小」。「高」是指高位元組,「大」是指大端序,「低」是指低位元組,「小」是指小端序,「高大低小」也即先存高位元組為大端序,先存低位元組為小端序。

舉個常見的例子。

位寬為32bit的cpu,要儲存的字資料為0x1234abcd,起始位址為0x4000。

大端序:

位址 0x4000 

0x4001 

0x4002 

0x4003 

內容 0x12 

0x34 

0xab

0xcd

小端序:

位址 0x4000 

0x4001 

0x4002 

0x4003 

內容 0xcd 

0xab

0x34 

0x12

以上是位元組域中,比較容易理解。

下面說一下在位域中。

先看乙個例子。

1 typedef struct

tagexp

2 example;89

union

10 test;

1415 test.texp.bit4 = 10

;16 test.texp.bit3 = 5

;17 test.texp.bit2 = 1

;18 test.texp.bit7 = 8;

test.result輸出是多少呢?

答案是,在intel cpu上得到的結果為0x10da,在mpc8560 cpu得到的結果為0xaa88。

下面來分析一下。

在intel cpu中,採用的是little-endian,從儲存器的低位元組開始儲存,在乙個位元組中,從低位開始儲存,低bit位儲存在低bit位址。也即

(圖中,yellow-bit4,green-bit3,blue-bit2,white-bit7)

在mcp8560 cpu中,採用的是big-endian,同樣從儲存器的低位元組開始儲存,而在乙個位元組中,是從高位開始儲存,高bit位儲存在高bit位址。也即

(圖中,yellow-bit4,green-bit3,blue-bit2,white-bit7)

位域比位元組域更深層了一步,是從bit的角度解釋了大端序和小端序。

綜合起來,就是兩句話。

高大低小:先存高位元組為大端序,先存低位元組為小端序。

最後附加乙個常用的c程式來判斷是大端序還是小端序。

1

bool

checkcpu()

2 c;

89 c.a = 1;10

11return(c.b == 1

)12 }

網路傳輸大端序 大端 小端與網路位元組序

大端 big endian 小端 little endian 以及網路位元組序的概念在程式設計中經常會遇到。網路位元組序 network byte order 一般是指大端 big endian,對大部分網路傳輸協議而言 傳輸,大端小端的概念是面向多位元組資料型別的儲存方式定義的,小端就是低位在前 ...

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

根據cpu的不同我們可以把主機位元組序在記憶體中儲存的順序叫做主機序,也就是我們常說的,大端機和小端機。我們經常看到的有兩種 1.小端機 記憶體中以小端序儲存的機器 將低位元組序儲存在開始的位址 及記憶體較小的記憶體 舉個例子 我們將記憶體從左到右排列 在記憶體中存放0x01020304 2000 ...

socket網路位元組序以及大端序小端序

不同cpu中,4位元組整數1在記憶體空間的儲存方式是不同的。4位元組整數1可用2進製表示如下 00000000 00000000 00000000 00000001 有些cpu以上面的順序儲存到記憶體,另外一些cpu則以倒序儲存,如下所示 00000001 00000000 00000000 000...