endians是什麼意思?它是資料在記憶體中的排列順序。在微處理器中,象long/dword(32 bits) 0x12345678 這樣的資料總是按照高位優先(big endian)方式存放的。但在記憶體中,資料存放順序則因微處理器廠商的不同而不同。
資料大小的不同:
byte:乙個位元組,標記為byte 0
word:二個位元組,從byte 0到byte 1
long : 四個位元組,從byte 0到byte 3
每個byte由8個位(bit)組成,從bit 7 到 bit 0 (從左往右)。
每個word由16個 bit 組成,從bit 15 到 bit 0 (從左往右)。
每個long由32個 bit 組成,從bit 31 到 bit 0 (從左往右)。
byte 0 是lsb (less significant byte,最低有效位元組),byte 3 是msb (most significant byte,最高有效位元組)。因此如果有:
byte : 3 2 1 0
number : $12 $34 $56 $78
則值等於:$12*256^3 + $34*256^2 + $56*256^1 + $78*256^0
word型別也一樣。word 0 是lsw (less significant word,最低有效字),word 1 是msw (most significant word,最高有效字):
word : 1 0
number : $1234 $5678
值等於:$1234*65536^1 + $5678*65536^0.
位元組存放方式:
byte : byte 3 ($12) (正好是msb)
word : byte 3 到 byte 2,即word 1 ($1234) (按照從msb 到 lsb 順序存放)
long : byte 3 到 byte 0,即word 1 到 word 0 ($12345678) (按照從msb 到 lsb 順序存放)
big endian 存放方式正是我們的書寫方式,大數先寫(比如,總是按照千、百、十、個位來書寫數字)。而且所有的處理器都是按照這個順序存放資料的。
n+0 : byte 3 ($12) (msb 優先: big endian)
n+1 : byte 2 ($34)
n+2 : byte 1 ($56)
n+3 : byte 0 ($78) (lsb)
byte 0 的位置是:'n+3' (在 'n+3', byte 0 等於 $78)
word 0 的位置是:'n+2' ('n+2' 到 'n+3', byte 1 到 byte 0, word 0 等於 $5678)
long 0 的位置是:'n+0' ('n+0' 到 'n+3', byte 3 到 byte 0, long 0 等於 $12345678)
高位優先方式對於嵌入式系統和除錯記憶體映象都很有用。在暫存器中讀到的資料就是記憶體裡的資料。但是如果要在word 0 的位址 'n+2' 處提取低位字(low word),就要用附加的記憶體,通過移位後才能得到,所以會稍慢些。
例如在暫存器中有:$12345678
big endian 排列順序還廣泛運用在tcp/ip協議上!主要使用big endian 排列結構的是摩托羅拉的 motorola 6800 系列,68000 系列和coldfire 系列。powerpc 是用低位優先(little endian)順序,它是從ibm power 處理器系列派生而來的。
byte : byte 0 ($78) (正好是 lsb)
word : byte 0 到 byte 1,即 word 0 ($7856) (按照從lsb 到msb 順序存放)
long : byte 0 到 byte 3,即 word 0 到 word 1 ($78563412) (按照從lsb 到msb 順序存放)
little endian 處理器是通過硬體將記憶體中的little endian 排列順序轉換到暫存器的big endian排列順序的,沒有資料載入/儲存的開銷,不用擔心。
n+0 : byte 0 ($78) (lsb 優先:little endian)
n+1 : byte 1 ($56)
n+2 : byte 2 ($34)
n+3 : byte 3 ($12) (msb)
byte 0 的位置是:'n+3' (在 'n+3', byte 0 等於 $78)
word 0 的位置是:'n+2' ('n+2' 到 'n+3', byte 1 到 byte 0, word 0 等於 $5678)
long 0 的位置是:'n+0' ('n+0' 到 'n+3', byte 3 到 byte 0, long 0 等於 $12345678)
byte 0 的位置是:'n+0' (在 'n+0', byte 0 等於 $78)
word 0 的位置是:'n+0' ('n+0' 到 'n+1', byte 0 到to byte 1, word 0 等於 $5678,按照 little endian 順序)
long 0 的位置是:'n+0' ('n+0' 到 'n+3', byte 0 to byte 3, long 0 等於 $12345678,按照 little endian 順序)
低位優先順序對於要取得諸如lsb或lsw這樣的低位資料是很有用的。只要在起始位置上直接提取即可。不過在記憶體除錯時可有些「古怪」。
例如在暫存器中有:$12345678
注意:少數一些處理器是按照little endian 排列順序來進行位運算的,就是說,乙個從bit 31 到bit 0 表達的long型別數值按照從bit 0到bit 31的順序來存放!
暫存器有: $12345678 (%10010001101000101011001111000)
公司: motorola toshiba intel
十進位制(decimal) : 123 123 123 (預設)
八進位制(octal) : @173 o173 173o
十六進製制(hexa) : $7b h7b 7bh
二進位制(binary) : %1111011 b1111011 1111011b
高位優先與低位優先
endians是什麼意思?它是資料在記憶體中的排列順序。在微處理器中,象long dword 32 bits 0x12345678 這樣的資料總是按照高位優先 big endian 方式存放的。但在記憶體中,資料存放順序則因微處理器廠商的不同而不同。資料大小的不同 byte 乙個位元組,標記為byt...
高位位元組優先 低位位元組優先
自第一台計算機誕生,其最小儲存單元就被永久的定格了 乙個由8個位元 bit 組成的稱為位元組 byte 的單位。計算機的所有記憶體以位元組陣列的方式進行編址。當乙個邏輯上長於乙個位元組的整形資料放置在記憶體中時 比如16位,32位,和64位的整數 計算機設計者需要考慮這些位元組的儲存順序。一些體系結...
乙個指標轉換引起的問題及談起」高位優先,低位優先」
在hp或aix機上試一下這個程式就知道 int為4位元組,short為2位元組 include int main int fun short i 從已有知識,我認為列印出來的是 2,2 但是,在hp或aix機器上,列印的結果是 131072 20000 在具體分析之前,先介紹 高位優先,低位優先 的...