C语言里的位域是一个比较复杂的问题,涉及的方面也比较多,关于位域的基础内容可以参考以下文章:理解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的字节数为: %d\n",sizeof(BitSeg1));
printf("BitSeg2的字节数为: %d\n",sizeof(BitSeg2));
return 0;
}
输出结果为:
第一次赋值后: a的值为:1 b的值为:2
第二次赋值后: a的值为:4 b的值为:-2
第二次赋值后: a的值为:0 b的值为:3
BitSeg1的字节数为: 4
BitSeg2的字节数为: 1
代码中的BigSeg1定义了两个int类型的字段,而且它们分别只占用4位和3位的空间。当BitSeg1中的a,b分别赋值为1和2时,输出的结果也如我们所料。当第二次赋值为100和30时,输出的结果却是4和-2,为什么呢?
责任编辑:小草