高位優先與低位優先

2021-09-08 05:56:18 字數 3164 閱讀 5094

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 在具體分析之前,先介紹 高位優先,低位優先 的...