c語言中位制

今天看書看到了位制的概念,對這個做出一點總結。
位制就是爲了減小存儲大小,把一個char, unsigned int, int的存儲空間進行拆分後,對每個進行操作。
給出一段代碼:

#include <stdio.h>
#include <stdlib.h>

typedef struct test
{
    char a : 4;
    char b: 1;
    char c: 1;
}test;

int main()
{
    test m;
    m.a = 3;
    m.b =3;
    m.c =3;
    printf("%d\n" ,sizeof(test));
    printf("%d\n" ,sizeof(char));

    return 0;
}

上面的代碼運行後發現,輸出爲1 ,1。
也就是說,test的長度和char的長度是一樣的。其實說白了test就是把一個char類型的存儲空間,拆分成4位,1位,1位的存儲空間進行操作。

下面,如果test裏的大小類型不一致呢:

#include <stdio.h>
#include <stdlib.h>

typedef struct test
{
    char a : 4;
    char b: 1;
    int c: 1;
}test;

int main()
{
    test m;
    m.a = 3;
    m.b =3;
    m.c =3;
    printf("%d\n" ,sizeof(test));
    printf("%d\n" ,sizeof(char));
    printf("%d\n" ,sizeof(int));

    return 0;
}

代碼輸出爲 8, 1, 4。
這裏應該是有一個對其的概念,也就是說test把char類型的也擴張成4字節的了,爲了跟int的對齊。

對位制,不能把設置的位數長度大於類型的長度,比如

typedef struct test
{
    char a : 10;
    char b: 1;
    char c: 8;
}test;

這裏10已經超過了char類型的長度,所有編譯錯誤。

還有對於如果總長度大於設置的類型呢

#include <stdio.h>
#include <stdlib.h>

typedef struct test
{
    char a : 8;
    char b: 1;
    char c: 8;
}test;

int main()
{
    test m;
    m.a = 3;
    m.b =3;
    m.c =3;
    printf("%d\n" ,sizeof(test));
    printf("%d\n" ,sizeof(char));

    return 0;
}

輸出結果爲3, 1
可以看出來,test自動分配了三個char類型的空間。大體瞭解了吧

發佈了33 篇原創文章 · 獲贊 16 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章