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