原文連接:https://blog.csdn.net/Andyzzhz/article/details/40405451函數
CPU:大小端模式的區別:
大端模式(Big-endian),是指數據的低位(就是權值較小的後面那幾位)保存在內存的高地址中,而數據的高位,保存在內存的低地址中,這樣的存儲模式有點兒相似於把數據看成字符串順序處理:地址由小向大增長,而數據從高位往低位放;
小端模式(Little-endian),是指數據的低位保存在內存的低地址中,而數據的高位保存在內存的高地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和咱們的邏輯方法一致。測試
內存地址高地的理解:
咱們對內存表的高位和低位的理解,就能夠想作這裏就是一張白紙. 咱們把每一個空格都看成一個位置,從0~1000開始計數,寫在最前的就是低位,
好比說寫四個數,從0~3 . GAME數據的低位~高位就是從G到M.
寄存器高位低位的理解:
以後呢,咱們從內存表中區數據,放入寄存器中,咱們能夠把寄存器比作一個水桶,咱們放入數據的時候確定是把"水"先倒到水筒的底部.
如咱們從內存中區GAME放入到水桶中的話 水桶中存放的數據就成了EMAG 也就是 45 4D 41 47 (注意每一個字節是兩個16進制的字符)
而水桶的高位和地位呢,想必你們會很明白,水桶的最上方就是高位,水桶底就是低位,因此EMAG 數據的高低位就是 E~G(E爲最高位 G爲最低位)
嵌入式系統開發者應該對Little-endian和Big-endian模式很是瞭解。
咱們經常使用的X86結構是小端模 式,而KEIL C51則爲大端模式。不少的ARM,DSP都爲小端模式spa
舉例:.net
假設有一塊內存,物理地址從1000-2000,如今要存一個數據1234H.(字型數據,佔16位,兩個字節,兩個儲存單元)blog
內存的儲存單元是字節,一個字節最大存10進制數255,16進制數FF.內存
在這裏,低地址單元(1000)存入34,高地址單元(1001)存12.讀取的時候就從高地址到低地址讀取:1234H.開發
若是還要存12H(byte字節數據)那麼就是,1002裏面放入12h字符串
此時內存排列是34 12 12.it
若是還要存一個數據12345678h(dword數據32位)io
那麼就是 78 56 34 12.
總的內存排列就是 34 12 12 78 56 34 12.(每一個字節做爲一個儲存單元)
能夠用下面的程序測試:
int checkSystem( )
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return (c.ch ==1);
}
若是當前系統爲大端模式這個函數返回 0;若是爲小端模式,函數返回 1