关于结构体位段的一些个人心得
一、结构位段一个格式:
1.定义在结构体内
2.位段的成员名后面有个冒号和数字
3.成员名的类型可以是int,char等
如图
struct Data{
int a : 3 ;
int b : 5 ;
int c : 6 ;
int d : 9 ;
}
二、各成员间是如何分配的
成员名后面冒号内的数字表示其的二进制的位数,但是其是按照补高位的规则来的,如
定义结构体
struct Data{
int a : 3 ;
};
令结构体内的数字为3
struct Data num;
num = { 3 } ;
printf("%d\n",num.a);
输出结果为3
但是如果令num = { 4 },输出为-4
令num = { 8 } ,输出为0.
输出结果
为什么呢
现在看看它的分配规则
1. 当num = { 3 } 时,3的二进制是11,取三位就是011,高位是0,所以a就是0000 0011,十进制就是3
2 当num = { 4 } 时,4的二进制是100,高位是1,所以a就是1111 1100,化为十进制就是-4
3 同理,num = { 8 }时,8的二进制是1000,取三位就是000,所以a就是0000 0000,十进制就是0
总结
可以看出,它是按照自动补高位的原则进行的,即在其位域内,最高位是1,则高位自动补1,化为十进制一定是负数。若其高位是0,则高位自动补0,十进制就是其位段内二进制数化为十进制后的数。
即当我们当输入成员的值的二进制位数小于其位段长度,那么该成员值与输入值相等。若输入成员的值的二进制位数等于其位段长度,那么高位自动补1,其值变为负。若大于,则取其长度等于位段长度的后一段,根据其最高位是1还是0来自动补齐
一个自己主动输入的方法
作者曾想过如何可以自己手动输入数进具有位段的成员里
尝试了以下方法
scanf("%d",&sum.a);
结果发现报错
然后我删去地址符
scanf("%d",sum.a);
去发现这样可以输入,但一直无法输出,那么我们该怎么办呢
询问了老师后,老师给我提供了下面这种方法
int x ;
scanf("%d",&x);
num = { x };
即用scanf输入一般变量,再赋值给位段就行了。