學c語言時,了解過大小端模式,但是一直都每怎麼理解,對於網上查到的各種判斷大小端的程式也是看的一知半解。最近再次看到大小端這個問題時,終於感覺頓悟了。以下是我的理解,如有錯的地方請指出。
大端模式,是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中。
小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中。
因為在計算機系統中,資料儲存是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8位。我們知道在c語言中,很多資料型別是超過8位的,short型、long型。。。這就涉及到資料儲存在記憶體中的排列順序。如short型的整數4386,表示為16進製制是0x1122(0x代表數字為16進製制),再表示為二進位制數是 0001 0001 0010 0010 (short佔2個位元組,所以共佔16位)。這個整數在記憶體中的儲存可能會有兩種方式:
低位址高位址1位元組
1位元組佔8位
佔8位大端模式
0001 0001
0010 0010
小端模式
0010 0010
0001 0001
確定高低位元組:
4386
0x1122
0001 0001
0010 0010
高位元組低位元組
以下程式可判斷儲存模式是大端還是小端:
#includevoid byteorder()
test; //聯合體內成員共用位址空間
test.value = 4386; //或0x1122
if((test.union_bytes[0]==0x11)&&(test.union_bytes[1]==0x22))
else if((test.union_bytes[0]==0x22)&&(test.union_bytes[1]==0x11))
else
//檢視各位址單元的資料儲存情況
printf("size_short = %d size_char = %d\n",sizeof(short),sizeof(char));
printf("& = %x\n",&(test.value)); //所輸整數的首位址
printf("&[0] = %x value = %d\n",&test.union_bytes[0],test.union_bytes[0]);
printf("&[1] = %x value = %d\n",&test.union_bytes[1],test.union_bytes[1]);
}int main()
輸出:
解釋這個程式,輸出表示的是:這是小端模式,short型占用2個位元組,char型占用1個位元組,short型整數4386的首位址是cb9dbb10,union_bytes[0]的位址是cb9dbb10,該位址單元儲存的是 00100010=34,union_bytes[1]的位址是cb9dbb11,該位址單元儲存的是 00010001=17。
程式中,因為聯合體union成員共享位址空間,而我們要觀察整數在各個位址單元的儲存情況,char型正好佔1個位元組,對應乙個位址單元,所有用short型和char型陣列作為同乙個聯合體成員。根據輸出,分析如下:
cb9dbb11
0001 0001
0x11
17cb9dbb10
0010 0010
0x22
34位址
位址單元儲存的二進位制資料
對應的16進製制
對應的10進製
可知低位址存的是低位元組,高位址存的是高位元組,所以為小端模式。
判斷系統大小端模式
端模式 endian 的這個詞出自jonathan swift書寫的 格列佛遊記 這本書根據將雞蛋敲開的方法不同將所有的人分為兩類,從圓頭開始將雞蛋敲開的人被歸為big endian,從尖頭開始將雞蛋敲開的人被歸為littile endian。小人國的內戰就源於吃雞蛋時是究竟從大頭 big endi...
如何判斷大小端模式?
大端模式就是低位元組儲存在高位址處而高位元組儲存在低位址處 小段模式就是低位元組儲存在低位址處而高位元組儲存在高位址處 根據這個特性,假設我們初始化了乙個int變數i為0x12345678,其位址為0x100,根據定義在小端模式下 0x100乙個位元組內的值為0x78,類推0x101 0x56,0x...
C語言判斷大小端模式
1.大端模式,是指資料的低位儲存在記憶體的高位址中,而資料的高位,儲存在記憶體的低位址中 小端模式相反 2.為什麼有大小端之分?因為在計算機系統中,儲存是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組 8bit。在c語言中除了8bit的char之外,還有16bit的short型,32b...