首頁 > 軟體

C語言進階幾分鐘帶你理解大小端儲存模式

2022-02-16 10:05:03

正片開始

C語言中資料型別的儲存是較為嚴謹的,一塊空間只能儲存一種資料型別,要知道記憶體這個東西,在早期可是非常珍貴的。

尤其對於那些效能不好計算機更是如此,比如 Office1997,作業系統為Windows95 ,奔騰1的cpu,記憶體只有128M。就這麼綠豆點大的儲存空間,要想達到節約,利用最大化就必須在同一塊空間中存入不同型別資料。

所以共用體的概念就隨之產生,將幾種不同型別的內容覆蓋到同一記憶體單元,之前在我的一篇共用體專題寫過,但感覺自己總結的還不夠到位,這裡再講講。

共用體原理

共用體和結構體非常相似,共用體定義很簡單,只需要 union + 共用體名即可,舉個栗子:

union student:
{
 char name;
 short age;
 int weight;
 char sex;
};

某種意義上,共用體與結構體是差不多的資料結構,他們都可以同時包含多種資料型別。

但是!畢竟不叫同一個名兒就不是同一個玩意兒,那他們==本質上的區別是啥?==這裡我先從記憶體方面下手,對於結構體,在記憶體中,他們有各自的儲存空間,不管這個這個成員我有沒有去使用他,C語言程式都會給他分配空間, 所以有結構體型別長度大於或等於各成員長度之和一說。

而在共用體中,各成員在一坨空間裡面,空間相當於是共用的的公共空間,一個共用體型別長度等於所有成員變數中最寬資料的長度,比如我剛剛的student 這個共用體中 ,有 char,short和 int 型別,此時該共用體型別長度就是4個位元組,也就是 int 型別長度。強調一下,這裡的共用並不是把多個變數同時放入一個共用體內,是指該共用體可被賦予任何一種變數的值,但每次賦值只能賦一種,多種還是會遵循共用體最長資料覆蓋原則,也就是說共用體在同一時間只能存放一個變數。

引申一下

為了去確定當前計算機的儲存模式,我們可以用共用體去試觸,判斷它是大端儲存還是小端儲存,這樣簡單又高效。

我們都知道計算機記憶體是以位元組為單位的劃分的,每個地址單元對應一個位元組,一個位元組佔 8 個 bit 位,一個 bit 對應儲存一個二進位制資料,比如 00000000;

另外還有 int ,long ,long long,在16位元和32位元處理器中,可同時處理16 bit 和32 bit 的資料,暫存器寬度都大於一個位元組,就此我們的大小端儲存模式應運而生。

位元組順序

在搞清楚大小端模式之前必須搞清楚位元組的順序,在兩個裝置之間進行資料的傳輸時,我要把一個東西從A傳到B,但這時發現在A裝置中,內容是正序的,但是B裝置中的內容是反序放著的,我們就無法在傳輸後得到正確的格式,所以就要要求統一的模式。

大小端儲存

大端儲存是指資料的低位位元組順序會儲存在記憶體的高地址中,小端儲存模式則恰恰相反,比如我將一個十六進位制數 0x1234ffff,對應位元組序由低到高從 f 到 1 ,從右向左依次讀取較低位位元組放在地址較大的記憶體單元中,如下:

小端儲存則會從右向左依次讀取較低位的位元組存入地址較小的記憶體單元中。

我們常用的X86結構,ARM就是小端模式,什麼 C51則為大端模式(沒學我也不知道是個啥,但還是擺出來)。

共用體判斷大小端

union num
{
int a;
char b[2];
};

比如我定義一個num共用體型別,再建立一個共用體變數 union num i,這時記憶體中會劃分出四個位元組的大小用於存放 num1;假設i的char型別 i.b = 0x1234,雖然這時我num1中的char型別沒有被賦值,但已經被我的 int 型別所覆蓋, 我們int 型別四個位元組對應四個空間,char型別只需一個空間,我們只需要觀察int的值是否在char空間中高位存放了低位位元組,是則為大端儲存,反之則為小端儲存,可用程式碼列印如下:

printf("i.a = %xn",i.a);
printf("i.b[0] = %xn",i.b[0]);
printf("i.b[1] = %xn",i.b[1]);

效果如圖:

可以看出我的電腦就是小端儲存滴。

今天就到這裡吧,摸了家人們,更多關於C語言進階大小端模式的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com