大小端與高位先行 低位先行

2021-08-30 13:57:22 字數 1419 閱讀 6903

近期學習嵌入式過程中混淆了大小端和高位先行、低位先行的區別,現總結如下。

首先解釋大端小端模式。大端模式即高位位元組存放在低位址中,低位位元組存放在高位址中;小端模式相反,高位位元組存放在高位址中,低位位元組存放在低位址中。用圖表示更加容易理解。如下圖,我們將資料0x01020304分別按照大端模式和小端模式存放在晶元中。

記憶體位址0x000000040x000000030x000000020x00000001

大端0x04

0x03

0x02

0x01

小端0x01

0x02

0x03

0x04

int main()

由於晶元都從低位址位開始取資料,那麼如果上述**輸出0x01,表示高位位元組0x01存放在低位址位,則此晶元採用大端模式;如果上述**輸出0x04,表示低位位元組0x04存放在低位址位,則此晶元採用小端模式。

大小端模式是一種儲存方式,是針對晶元來說的,每乙個晶元在出廠時都已經規定好了大小端,使用者不可以更改。

然後解釋高位先行(msb)和低位先行(lsb)。高位先行即在傳輸乙個位元組的時候先傳輸高位;低位先行即在傳輸乙個位元組的時候先傳輸低位。高位先行和低位先行是針對序列資料傳輸方式來說的。常見的序列傳輸方式有串列埠(uart)、i2c、spi等。以串列埠傳輸方式為例,標準的串列埠傳輸方式是低位先行,如下圖所示,晶元在通過tx引腳傳送資料時,依次傳送位0、位1……位7。

一般的晶元都整合串列埠外設,大家在使用串列埠時直接配置就行,可能體會不到高位先行和低位先行。下面以常用的模擬i2c為例,從**上更加直觀的看一下高位先行和低位先行。

i2c在資料傳輸時,協議規定了資料傳輸必須是高位先行,以下**為i2c傳送乙個位元組:

void iic_send_byte(u8 txd)

}

從第8行和第9行**中可以看到,在傳送乙個位元組時,先將最高位傳送出去,然後是第6位……第0位;同樣在接收乙個位元組時,接收到的第1位認為是最高位,接收乙個位元組**如下:

u8 iic_read_byte(unsigned char ack)

if (!ack)

iic_nack();//傳送非應答

else

iic_ack(); //傳送應答

return receive;

}

所有使用i2c的裝置必須遵循i2c協議,必須都是高位先行的,這樣才能實現通用性。

高位優先與低位優先

endians是什麼意思?它是資料在記憶體中的排列順序。在微處理器中,象long dword 32 bits 0x12345678 這樣的資料總是按照高位優先 big endian 方式存放的。但在記憶體中,資料存放順序則因微處理器廠商的不同而不同。資料大小的不同 byte 乙個位元組,標記為byt...

高位優先與低位優先

endians是什麼意思?它是資料在記憶體中的排列順序。在微處理器中,象long dword 32 bits 0x12345678 這樣的資料總是按照高位優先 big endian 方式存放的。但在記憶體中,資料存放順序則因微處理器廠商的不同而不同。資料大小的不同 byte 乙個位元組,標記為byt...

WPARAM與LPARAM的高位與低位問題

在寫訊息處理函式時,常會遇到wparam與lparam這兩個引數,這兩個引數都是dword型別的,也就是雙字或四位元組或32位長度的。有時想取這些引數裡的高位字或低位字,用什麼方法呢?查msdn說有兩個巨集函式可用 取高位字 word hiword dword dwvalue 取低位字 word l...