所謂的大端模式,是指資料的低位(就是權值較小的後面那幾位)儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;
所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數
據的高位儲存在記憶體的高位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低,和我們的邏輯方法一致。
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為
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處理器還可以由硬體來選擇是大端模式還是小端模式。
下面這段**可以用來測試一下你的編譯器是大端模式還是小端模式:
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //
低位址單元
x1=((char*)&x)[1]; //
高位址單元
若x0=0x11,
則是大端; 若
x0=0x22,
則是小端
......
上面的程式還可以看出,資料定址時,用的是低位位元組的位址。
int i=1;
char *p=(char *)&i;
if(*p==1)
printf("1");
else
printf("2");
大小端儲存問題,如果小端方式中(
i佔至少兩個位元組的長度)則
i所分配的記憶體最小位址那個位元組中就存著
1,其他位元組是
0.大端的話則1在
i的最高位址位元組處存放,
char
是乙個位元組,所以強制將
char型量p
指向i則p
指向的一定是
i的最低位址,那麼就可以判斷
p中的值是不是
1來確定是不是小端。
請寫乙個
c函式,若處理器是
big_endian
的,則返回
0;若是
little_endian
的,則返回1
解答:int checkcpu( )
c;
c.a = 1;
return(c.b ==1);
} }
剖析:
嵌入式系統開發者應該對
little-endian
和big-endian
模式非常了解。採用
little-endian
模式的cpu
對運算元的存放方式是從低位元組到高位元組,而
big-endian
模式對運算元的存放方式是從高位元組到低位元組。例如,
16bit
寬的數0x1234
在little-endian
模式cpu
記憶體中的存放方式(假設從位址
0x4000
開始存放)為:
記憶體位址
0x4000
0x4001
存放內容
0x34
0x12
而在big-endian
模式cpu
記憶體中的存放方式則為:
記憶體位址
0x4000
0x4001
存放內容
0x12
0x34
32bit
寬的數0x12345678
在little-endian
模式cpu
記憶體中的存放方式(假設從位址
0x4000
開始存放)為:
記憶體位址
0x4000
0x4001
0x4002
0x4003
存放內容
0x78
0x56
0x34
0x12
而在big-endian
模式cpu
記憶體中的存放方式則為:
記憶體位址
0x4000
0x4001
0x4002
0x4003
存放內容
0x12
0x34
0x56
0x78
聯合體union
的存放順序是所有成員都從低位址開始存放,面試者的解答利用該特性,輕鬆地獲得了
cpu對記憶體採用
little-endian
還是big-endian
模式讀寫。如果誰能當場給出這個解答,那簡直就是乙個天才的程式設計師。
大小端儲存問題
所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中...
儲存大小端問題
所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中...
大小端儲存問題
所謂的大端模式,是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式,是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址中...