结构体的位制

在使用结构体位制的时候有两点要特别注意:

1、位段成员的类型只能为int和unsigned类型!

2、定义长度为0的位段时不能指定名字,否则编译不过。定义了0字段后,紧接着的下一个成员从下一个存储单元开始。

#include <stdio.h> typedef struct _A { unsigned int a:4;//位段成员的类型仅能够为unsigned或者int unsigned b:4; unsigned c:2; unsigned d:6; unsigned E:1; unsigned D:2; unsigned T:3; unsigned A:9; unsigned h:4; //前面已经为31,故4+31>32已超过一个存储单元,所以4在一个新的存储单元存放 unsigned y:29;//由于前面的4在一个新的存储单元的开头存放,且29+4>32, 故在另一个新的存储单元存放 }A; //所以最后求出的A的大小是4 + 4 + 4 =12 /*对上面的具体解释: 一个位段必须存储在同一个存储单元中,不能跨两个单元.如果某存储单元空间中不能容纳 下一个位段,则改空间不用,而从下一个存储单元起存放该位段. 结构体A中的h和y就是这种情况. 在gcc环境下,测试后,一个存储单元为4个字节. */ typedef struct _S { unsigned a:4; unsigned b:4; unsigned c:22; unsigned q:1; unsigned h:1; //unsigned i:33; // 错误:‘i’ 的宽度超过它自身的类型 //unsigned i:1;当多出此行时,该结构体大小由4变为8,因为此行之前正好为32位 } S; typedef struct _T { //当没有占满一个存储单元时,结构体的大小对齐为一个存储单元的大小 unsigned a:2; unsigned b:2; unsigned j:1; unsigned : 1;//可以定义无名位段,此例中该无名位段占用1位的空间,该空间将不被使用 } T; typedef struct _V { unsigned a:1; unsigned b:4; unsigned :0; //定义长度为0的位段时不能指定名字,否则编译不过 unsigned d:1; //定义了0字段后,紧接着的下一个成员从下一个存储单元开始存放; }V; //此例子中,d前面那个存储单元中的余下的27位中被0填充了 int main() { A a; S s; T t; V v; printf("sizeof(a)=%d\n", sizeof(a)); printf("sizeof(s)=%u\nsizeof(t)=%u\n", sizeof(s), sizeof(t)); printf("sizeof(v)=%d\n", sizeof(v)); return 0; }

运行的结果:
结构体位制 - linhuang629 - linhuang629的博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值