一:什么是大小端?
咱們中文中常常提到的大小端的英文名字為“endianness”,英文直譯的意思是“字節序”,是內存中存儲數據的字節順序。在這里一定要記住是“字節的順序”,應為在計算機系統中,都是以字節為單位的,每個地址單元都對應一個字節,即8bit。
在C語言系統中,除了8bit的char類型,還有16bit的short類型、32bit的long類型。對于超過8bit的數據的存儲,必然存在存在如何將多個字節排序的問題,因此就導致了大端存儲模式和小端存儲模式。
如果系統是大端,則首先存儲 MSB 字節,即高字節存儲在低地址;若系統是小端,則首先存儲LSB字節,即低字節存儲在低地址。
針對這兩種模式,我常用的記憶宮殿方法是:“小弟弟”,即小端系統的低字節存儲到低地址,大端則反之。
二:詳解大小端模式
假設,需要存儲的32bit的數據為:0x11223344。

對于大端模式:低位地址存儲著高字節的數據。

對于小端系統:低位地址存儲著低字節的數據。


三:如何判斷單片機的大小端模式?
若想要知道自己使用的單片機是大端或小端模式,可以通過下方的代碼進行判斷。
//檢查大小端模式,大端模式返回true;小端模式返回falsebool CheckisBigEndian(void){uint32_t u32RawData;uint8_t *pu8CheckData;u32RawData = 0x11223344; //Assign datapu8CheckData = (uint8_t *)&u32RawData; //Type castif (*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 anotheruint32_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單片機符合“小弟弟”的存儲邏輯,屬于小端系統;

原文標題:超全面講解單片機的大小端模式
文章出處:【微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
審核編輯:湯梓紅
-
單片機
+關注
關注
6076文章
45495瀏覽量
670374 -
計算機
+關注
關注
19文章
7807瀏覽量
93202 -
C語言
+關注
關注
183文章
7644瀏覽量
145598
原文標題:超全面講解單片機的大小端模式
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
LC87F1M16A:多功能8位單片機的詳細剖析與應用指南
一文解析單片機晶振腳的原理
單片機:一個承載科技與工程思維的核心平臺
單片機燒錄原理是怎樣的?輝芒微單片機燒錄程序詳細步驟講解
什么單片機比較耐用
單片機采用什么電流控制
用單片機怎么控制轉速
怎么測單片機系統頻率
單片機怎么驅動電機?
單片機怎么燒程序
低功耗單片機工作模式是怎樣的?看完這篇你就懂了!
單片機和伺服有什么區別
PLC和單片機到底有什么區別?
一文詳細了解單片機的大小端模式
評論