大端模式,是指資料的低位(就是權值較小的後面那幾位)儲存在記憶體的高位址中,而資料的高位儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:位址由小向大增加,而資料從高位往低位放;
小端模式,是指資料的低位儲存在記憶體的低位址中,而資料的高位儲存在記憶體的高位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低,和我們的邏輯方法一致。
為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為 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,則是小端......上面的程式還可以看出,資料定址時,用的是低位位元組的位址。
c語言面試題
試題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
記憶體位址
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模式讀寫。如果誰能當場給出這個解答,那簡直就是乙個天才的程式設計師。
2.char str = 「hello」 ;
char *p = str ;
int n = 10;
請計算sizeof (str ) = 6
sizeof ( p ) = 4
sizeof ( n ) = 4
void func ( char str[100])
void *p = malloc( 100 );
請計算sizeof ( p ) = 4
自己在tc中實際測試:
char str[100] = ;
printf("sizeof(str)=%d/n",sizeof(str)); ==》100
printf("sizeof(str[100])=%d/n",sizeof(str[100])); ==》1
void func(char str[100])
main(int argc,char *argv) ;
func(str); }
3、在c++程式中呼叫被 c編譯器編譯後的函式,為什麼要加 extern 「c」? (5分)
答:c++語言支援函式過載,c語言不支援函式過載。函式被c++編譯後在庫中的名字與c語言的不同。假設某個函式的原型為: void foo(int x, int y);該函式被c編譯器編譯後在庫中的名字為_foo,而c++編譯器則會產生像_foo_int_int之類的名字。c++提供了c連線交換指定符號extern「c」來解決名字匹配問題。
4.有關記憶體的思考題
void getmemory(char *p)
void test(void)
請問執行test函式會有什麼樣的結果?
答:程式崩潰。因為getmemory並不能傳遞動態記憶體,test函式中的 str一直都是 null。
strcpy(str, "hello world");將使程式崩潰。
char *getmemory(void)
void test(void)
請問執行test函式會有什麼樣的結果?
void getmemory2(char **p, int num)
void test(void)
請問執行test函式會有什麼樣的結果?
答:(1)能夠輸出hello
(2)記憶體洩漏
void test(void)
}請問執行test函式會有什麼樣的結果?
答:篡改動態記憶體區的內容,後果難以預料,非常危險。因為free(str);之後,str成為野指標,if(str != null)語句不起作用。
小端模式和大端模式 大端模式和小端模式
0x123456在記憶體中的儲存方式 大端模式 低位址 小端模式 低位址 不難看出大端模式比較符合人的直觀認識 1.一開始是由於不同架構的cpu處理多個位元組資料的順序不一樣,比如x86的是小段模式,keil c51是大端模式。但是後來網際網路流行,tcp ip協議規定為大端模式,為了跨平台通訊,還...
大端模式小端模式
大端 和 小端 可以追溯到1726年的jonathan swift的 格列佛遊記 其中一篇講到有兩個國家因為吃雞蛋究竟是先打破較大的一端還是先打破較小的一端而爭執不休,甚至爆發了戰爭。1981年10月,danny cohen的文章 論聖戰以及對和平的祈禱 on holy wars and a ple...
大端模式小端模式
什麼是大端和小端 大端小端是位元組在記憶體中的儲存的順序。自己理解 方便記憶 從低位址開始到高位址,如果先存高位位元組,那麼就是大端模式,如果是先存低位位元組,就是小端模式。當然是針對至少占用兩個位元組的資料來說,如果是只占用乙個位元組,就沒有大端小端問題了。另外網路位元組順序是大端模式。大端小端各...