一:什么是大小端?
咱們中文中常常提到的大小端的英文名字為“endianness”,英文直譯的意思是“字節(jié)序”,是內(nèi)存中存儲(chǔ)數(shù)據(jù)的字節(jié)順序。在這里一定要記住是“字節(jié)的順序”,應(yīng)為在計(jì)算機(jī)系統(tǒng)中,都是以字節(jié)為單位的,每個(gè)地址單元都對應(yīng)一個(gè)字節(jié),即8bit。
在C語言系統(tǒng)中,除了8bit的char類型,還有16bit的short類型、32bit的long類型。對于超過8bit的數(shù)據(jù)的存儲(chǔ),必然存在存在如何將多個(gè)字節(jié)排序的問題,因此就導(dǎo)致了大端存儲(chǔ)模式和小端存儲(chǔ)模式。
如果系統(tǒng)是大端,則首先存儲(chǔ) MSB 字節(jié),即高字節(jié)存儲(chǔ)在低地址;若系統(tǒng)是小端,則首先存儲(chǔ)LSB字節(jié),即低字節(jié)存儲(chǔ)在低地址。
針對這兩種模式,我常用的記憶宮殿方法是:“小弟弟”,即小端系統(tǒng)的低字節(jié)存儲(chǔ)到低地址,大端則反之。
二:詳解大小端模式
假設(shè),需要存儲(chǔ)的32bit的數(shù)據(jù)為:0x11223344。
對于大端模式:低位地址存儲(chǔ)著高字節(jié)的數(shù)據(jù)。
對于小端系統(tǒng):低位地址存儲(chǔ)著低字節(jié)的數(shù)據(jù)。
三:如何判斷單片機(jī)的大小端模式?
若想要知道自己使用的單片機(jī)是大端或小端模式,可以通過下方的代碼進(jìn)行判斷。
//檢查大小端模式,大端模式返回true;小端模式返回false
bool CheckisBigEndian(void)
{
uint32_t u32RawData;
uint8_t *pu8CheckData;
u32RawData = 0x11223344; //Assign data
pu8CheckData = (uint8_t *)&u32RawData; //Type cast
if (*pu8CheckData == 0x44) //check the value of lower address
{
return false;
}
else if (*pu8CheckData == 0x11) //check the value of lower address
{
return true;
}
}
四:大端模式與小端模式怎么轉(zhuǎn)換?
我們可以使用 下面的算法將大端模式轉(zhuǎn)換為小端模式,反之亦然。
to change one endian to another
uint32_t ChangeEndianness(uint32_t u32Value)
{
uint32_t u32Result = 0;
u32Result |= (u32Value & 0x000000FF) << 24;
u32Result |= (u32Value & 0x0000FF00) << 8;
u32Result |= (u32Value & 0x00FF0000) >> 8;
u32Result |= (u32Value & 0xFF000000) >> 24;
return u32Result;
}
五:STM32是大端還是小端模式?
從下圖中關(guān)于STM32的手冊介紹中可發(fā)現(xiàn):我們常用的STM32單片機(jī)符合“小弟弟”的存儲(chǔ)邏輯,屬于小端系統(tǒng);
原文標(biāo)題:超全面講解單片機(jī)的大小端模式
文章出處:【微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
審核編輯:湯梓紅
-
單片機(jī)
+關(guān)注
關(guān)注
6030文章
44491瀏覽量
632014 -
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7372瀏覽量
87637 -
C語言
+關(guān)注
關(guān)注
180文章
7595瀏覽量
135878
原文標(biāo)題:超全面講解單片機(jī)的大小端模式
文章出處:【微信號(hào):mcu168,微信公眾號(hào):硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論