结构体位段

关于结构体位段的一些个人心得
一、结构位段一个格式:
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输入一般变量,再赋值给位段就行了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AC Maker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值