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,為什么呢?
分析代碼如下:
#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,為什么呢?

