輔導(dǎo):C語言里的位域

字號(hào):

C語言里的位域是一個(gè)比較復(fù)雜的問題,涉及的方面也比較多,關(guān)于位域的基礎(chǔ)內(nèi)容可以參考以下文章:理解C語言位域
    分析代碼如下:
    #include "stdio.h"
    #include "memory.h"
    struct BitSeg1{
    int a:4;
    int b:3;
    };
    struct BitSeg2{
    char a:4;
    char b:3;
    };
    int main()
    {
    struct BitSeg1 ba1;
    ba1.a=1;
    ba1.b=2;
    printf("第一次賦值后: a的值為:%d\tb的值為:%d\n",ba1.a,ba1.b);
    ba1.a=100;
    ba1.b=30;
    printf("第二次賦值后: a的值為:%d\tb的值為:%d\n",ba1.a,ba1.b);
    char str[]="0123";
    memcpy(&ba1,str,sizeof(BitSeg1));
    printf("第二次賦值后: a的值為:%d\tb的值為:%d\n",ba1.a,ba1.b);
    printf("BitSeg1的字節(jié)數(shù)為: %d\n",sizeof(BitSeg1));
    printf("BitSeg2的字節(jié)數(shù)為: %d\n",sizeof(BitSeg2));
    return 0;
    }
    輸出結(jié)果為:
    第一次賦值后: a的值為:1 b的值為:2
    第二次賦值后: a的值為:4 b的值為:-2
    第二次賦值后: a的值為:0 b的值為:3
    BitSeg1的字節(jié)數(shù)為: 4
    BitSeg2的字節(jié)數(shù)為: 1
    代碼中的BigSeg1定義了兩個(gè)int類型的字段,而且它們分別只占用4位和3位的空間。當(dāng)BitSeg1中的a,b分別賦值為1和2時(shí),輸出的結(jié)果也如我們所料。當(dāng)?shù)诙钨x值為100和30時(shí),輸出的結(jié)果卻是4和-2,為什么呢?