一:什么是大小端?
咱們中文中常常提到的大小端的英文名字為“endianness”,英文直譯的意思是“字節(jié)序”,是內存中存儲數據的字節(jié)順序。在這里一定要記住是“字節(jié)的順序”,應為在計算機系統(tǒng)中,都是以字節(jié)為單位的,每個地址單元都對應一個字節(jié),即8bit。
在C語言系統(tǒng)中,除了8bit的char類型,還有16bit的short類型、32bit的long類型。對于超過8bit的數據的存儲,必然存在存在如何將多個字節(jié)排序的問題,因此就導致了大端存儲模式和小端存儲模式。
如果系統(tǒng)是大端,則首先存儲 MSB 字節(jié),即高字節(jié)存儲在低地址;若系統(tǒng)是小端,則首先存儲LSB字節(jié),即低字節(jié)存儲在低地址。
針對這兩種模式,我常用的記憶宮殿方法是:“小弟弟”,即小端系統(tǒng)的低字節(jié)存儲到低地址,大端則反之。
二:詳解大小端模式
假設,需要存儲的32bit的數據為:0x11223344。
對于大端模式:低位地址存儲著高字節(jié)的數據。
對于小端系統(tǒng):低位地址存儲著低字節(jié)的數據。
三:如何判斷單片機的大小端模式?
若想要知道自己使用的單片機是大端或小端模式,可以通過下方的代碼進行判斷。
//檢查大小端模式,大端模式返回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;
}
}
四:大端模式與小端模式怎么轉換?
我們可以使用 下面的算法將大端模式轉換為小端模式,反之亦然。
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是大端還是小端模式?
從下圖中關于STM32的手冊介紹中可發(fā)現:我們常用的STM32單片機符合“小弟弟”的存儲邏輯,屬于小端系統(tǒng);
原文標題:超全面講解單片機的大小端模式
文章出處:【微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
審核編輯:湯梓紅
-
單片機
+關注
關注
6067文章
44992瀏覽量
650464 -
計算機
+關注
關注
19文章
7663瀏覽量
90800 -
C語言
+關注
關注
180文章
7632瀏覽量
141751
原文標題:超全面講解單片機的大小端模式
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
如何優(yōu)化單片機項目的功耗
基于51單片機的多模式音樂跑馬燈

如何實現51單片機與PC機的串行通信
單片機不工作的原因
單片機的中斷機制
單片機出現故障怎么維修
單片機異常復位的原因
單片機基本io功能調試過程
單片機io口怎么配置成輸出口
單片機io口輸出電流多大
單片機燒錄程序的基本步驟是什么
單片機boot0和boot1怎么設置
藍牙模塊如何實現單片機和手機端數據互傳

評論