這是因為在計算機系統中我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但在c語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於8位的處理器,例如16位或者32位處理器,由於暫存器寬度大於乙個位元組,那麼必然存在著乙個如何將多個位元組安排的問題。因此就有了大端儲存和小端儲存模式。
例如乙個16bit的short型x,在記憶體中的位址為0x0010,x的值為0x1122,那麼0x11位高位元組,0x22為低位元組。對於大端模式,就將0x11放在第位址中,即0x0010中,0x22放在高位址中,即0x001中。小端模式,剛好相反。我們常用的x86結構是小端模式,而kell c51則為大端模式。很多的arm,dsp都為小端模式。
大端(儲存)模式,是指資料的底位儲存在記憶體高的位址中,而資料的高位,儲存在記憶體低的地中;
小端(儲存)模式,是指資料的底位儲存在記憶體的底位址中,而資料的高位,儲存在記憶體高的地中;
字元指標判斷
在32位平台下,int佔4個位元組,而char型別的指標是佔乙個位元組的,如果我們把int強傳為char型別的指標,只會儲存乙個位元組的資料,那麼我們只需要判斷char裡面的第乙個位元組和int裡面的第乙個位元組是否是一致即可判斷,即若返回值為1則為小端模式,反之為大端模式。
int
check_sys()
聯合體判斷
由於聯合體所有資料共享一塊位址空間(即下例 變數i,c空間公用,union空間至少為4位元組),存放資料的所有成員都是從低位址開始存放(依次遞加至其所屬型別位元組大小),所以我們可以在聯合體內定義乙個int和乙個char型別變數,我們給變數i賦值為1(儲存形式 :01 00 00 00,位址由底到高),此時若返回值變數c為1,則低位元組存放在低位址,證明為小端。
int
check_sys()
ss ss.i =1;
return ss.c;
}
機器的大小端
用c語言寫程式時需要知道是大端模式還是小端模式。所謂的大端模式 be big endian 是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 低對高,高對高 最直觀的位元組序,因為不要考慮對應關係 只需要把記憶體位址從左到右按照由低到高的順序寫出,把值按照通常的高位到低位的...
判斷機器大小端
引用 一 機器大小端 1 大端模式 是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 這和我們的閱讀習慣一致。short a 0x1234 如果0x12在低址處,就是大端2 小端...
大小端機器的判定
所謂的 大端模式 是指資料的低位 就是權值較小的後面那幾位 儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理 位址由小向大增加,而資料從高位往低位放 所謂的小端模式 是指資料的低位儲存在記憶體的低位址中,而數 據的高位儲存在記憶體的高位址...