談到位元組序的問題,必然牽涉到兩大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 structtest.result輸出是多少呢?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;
答案是,在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程式來判斷是大端序還是小端序。
1bool
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...