大端小端的概念
端模式(endian)的這個詞出自jonathan swift書寫的《格列佛遊記》。這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian。小人國的內戰就源於吃雞蛋時是究竟從大頭(big-endian)敲開還是從小頭(little-endian)敲開。
在計算機業big endian和little endian也幾乎引起一場戰爭。在計算機業界,endian表示資料在儲存器中的存放順序。下文舉例說明在計算機中大小端模式的區別。
如果將乙個32位的整數0x12345678存放到乙個整型變數(int)中,這個整型變數採用大端或者小端模式在記憶體中的儲存由下表所示。為簡單起見,本書使用op0表示乙個32位資料的最高位元組msb(most significant byte),使用op3表示乙個32位資料最低位元組lsb(least significant byte)。
位址偏移
大端模式
小端模式
0x00 12
(op0)
78(op3)
0x01 34
(op1)
56(op2)
0x02 56
(op2)
34(op1)
0x03 78
(op3)
12(op0)
如果將乙個16位的整數0x1234存放到乙個短整型變數(short)中。這個短整型變數在記憶體中的儲存在大小端模式由下表所示。
位址偏移
大端模式
小端模式
0x00
12(op0)
34(op1)
0x01
34(op1)
12(op0)
由上表所知,採用大小模式對資料進行存放的主要區別在於在存放的位元組順序,大端方式將高位存放在低位址,小端方式將低位存放在高位址。採用大端方式 進行資料存放符合人類的正常思維,而採用小端方式進行資料存放利於計算機處理。到目前為止,採用大端或者小端進行資料存放,其孰優孰劣也沒有定論。
c語言中判斷大小端的方法
有時候,用c語言寫程式時需要知道是大端模式還是小端模式。 所謂的大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中;小端模式相反。為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如果將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。例如乙個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11為高位元組,0x22為低位元組。對於大端模式,就將0x11放在低位址中,即0x0010中,0x22放在高位址中,即0x0011中。小端模式,剛好相反。
我們常用的x86結構是小端模式,而keil-c51則為大端模式。很多的arm,dsp都為小端模式。有些arm處理器還可以由硬體來選擇是大端模式還是小端模式。
下面這段**可以用來測試一下你的編譯器是大端模式還是小端模式:
#include
int main()
若x1=0x11,則是大端; 若x2=0x22,則是小端……
#include
int main()
else
return
0;}
儲存器模式(small large compact)
c51 提供了3 種儲存器模式來儲存變數過程引數和分配再入函式堆疊你應該盡量
使用小儲存器模式,很少應用系統需要使用其它兩種模式。像有大的再入函式堆疊系統那
樣一般來說如果系統所需要的記憶體數小於內部ram 數時都應以小儲存模式進行編譯,
在這種模式下data 段是所有內部變數和全域性變數的預設儲存段所有引數傳遞都發生在
data 段中。如果有函式被宣告為再入函式編譯器會在內部ram 中為他們分配空間,這種模式的優勢就是資料的訪問速度很快,但只有120 個位元組的儲存空間供你使用總共有128個位元組,但至少有8 個位元組被暫存器組使用你還要為程式呼叫開闢足夠的堆疊
如果你的系統有256 位元組或更少的外部ram 你可以使用壓縮儲存模式,這樣一來
如果不加說明,變數將被分配在pdata 段中,這種模式將擴充你能夠使用的ram 數量對xdata 段以外的資料儲存仍然是很快的變數的引數傳遞,將在內部ram 中進行,這樣儲存速度會比較快,對pdata 段的資料的定址是通過r0 和r1 進行間接定址比使用dptr 要快一些,在大儲存模式中所有變數的預設儲存區是xdata 段,keil c 盡量使用內部暫存器組進行引數傳遞,在暫存器組中可以傳遞引數的數量和和壓縮儲存模式一樣再入函式的模擬棧將在xdata 中,對xdata 段資料的訪問是最慢的,所以要仔細考慮變數應儲存的位置使資料的儲存速度得到優化。
C語言判斷大小端
思路 明確大小端 如圖示 程式思路 1 思考資料的儲存方式以及位址排列,int型 在32 位作業系統下 占有 4位元組,char 型 占有1字元,因此可以利用char 型指標判斷 int 型位址與資料 2 如 若有整形 int b 0x 77 ff 10 01,則我們知 0x 01 0x 10,0x...
C語言判斷大小端模式
1.大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 小端模式相反 2.為什麼有大小端之分?因為在計算機系統中,儲存是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組 8bit。在c語言中除了8bit的char之外,還有16bit的short型,32b...
C語言 大小端的判斷
在文章的開頭我首先要介紹一下大小端的概念 大端模式 是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 小端模式 是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記...