1. 程式人生 > >大小端(資料在記憶體中的儲存)

大小端(資料在記憶體中的儲存)

大小端模式介紹

  • 大端(儲存)模式:是指一個數據的低位位元組序的內容放在高地址處,高位位元組序存的內容放在低地址處。
  • 小端(儲存)模式:是指一個數據的低位位元組序內容存放在低地址處,高位位元組序的內容存放在高地址處。(可以總結為“小小小”即低位、低地址、小端)

在計算機系統中,我們是以位元組為單位存放資料的,每個地址單元都對應著一個位元組,一個位元組為8bit。但在C語言中存在不同的資料型別,佔用的位元組數也各不相同,那麼就存在怎樣存放多個位元組的問題,因此就出現了大端儲存模式和小端儲存模式。

我們可以建立一個整型變數i,在除錯時,開啟除錯>>視窗>>記憶體,輸入&i,就可以在記憶體視窗中看到變數i在記憶體中是如何儲存的了。


從圖可以看出整型變數i在記憶體中是其位元組序低位的內容存放在低地址,位元組序高位的內容存放在高地址,所以這臺機器是小端儲存模式。

由此我們可以通過觀察低地址處存放的內容來判斷當前機器的儲存模式,那麼我們可以設計一個小程式來判斷當前機器的儲存模式

  • 方法1:
#include <stdio.h>
int main()
{
    int i = 1;
    char *a = (char *)&i;
    if(*a == 1)
        printf("小端\n");
    else
        printf("大端\n");
    return
0; }

  • 方法2:共同體判斷
int Check_Sys()
{
    union
    {
        int i;
        char c;
    }un;
    un.i = 1;
    return un.c;//如果是小端返回1,如果是大端返回0
}

int main()
{
    if(Check_Sys())
        printf("小端\n");
    else
        printf("大端\n");
    return 0;
}


上面的共用體變數un,大小sizeof(un)=4,
注意使用共用體(聯合)判斷時,不能僅依靠公用型別最大者為其共用體變數大小,應遵守對其原則和補齊原則。

  • 對齊原則
    結構體變數中元素是按照定義順序一個一個放到記憶體中去的,但並不是緊密排列的。從結構體儲存的首地址開始,每一個元素放置到記憶體中時,它都會認為記憶體是以它自己的大小來劃分的,因此元素放置的位置一定會在自己寬度的整數倍上開始(以結構體變數首地址為0計算)。

  • 補齊原則:
    檢查計算出的儲存單元是否為所有元素中所佔記憶體最大的元素的長度的整數倍,是,則結束;若不是,則補齊為它的整數倍。

舉一個例子:

union Un
{
    int i;
    char arr[5];
};

sizeof(union Un)=8