判斷大小端模式

2021-06-29 03:37:39 字數 1863 閱讀 8439

學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...