C语言:位段、枚举、共用体

位段

位段也是一种结构体类型,是申请二进制位

  1. 成员必须是int,unsigned int,或signed int,char
  2. 成员名后有一个冒号和一个数字
  3. 位段的空间上是按照需要,以int或char开辟
  4. 位段不能跨平台

在这里插入图片描述

  • a需要2个比特位,b需要5个比特位,c需要10个比特位,d需要30个比特位
    内存分配
  • 先给a开辟4个字节,使用2个比特位,b使用5个比特位,c用10个,对于d就不够了,然后再开辟4个字节

计算位段所占空间大小

  1. 成员变量不能跨字节存储
  2. 成员变量不能跨类型存储(总大小要考虑字节对齐)
  3. 成员变量后所标注的所占字节数不能超过字节本身比特位
  4. 在存储数据时注意二进制位的丢失

数据的存储
在这里插入图片描述

位段的跨平台问题

  1. int 位段被当成有符号数还是无符号数是不确定的。(编译器将最高位是否是符号位不确定)
  2. 位段中最大位的数目不能确定。(32位机器最大32个比特位,冒号后写33,就会出现错误)
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是否舍弃剩余的位还是利用,这是不确定的。

枚举:

把可能的取值一一列举出来,关键字 enum
定义一个枚举类型,枚举取值是常量,常量不能被修改,但是可以赋初始值
在这里插入图片描述

#define与emun

  1. #define定义的是符号,在后续的预处理阶段会将代码替换成0,1,2,调试与代 码执行不同;不能调试
  2. 用emun实现,Mon是有类型的更严谨
  3. 防止命名冲突
  4. 枚举更方便使用

枚举类型是4个字节,不论里面有多少数据,因为枚举每次只为其中一个类型开辟空间

共用体(联合体):

一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用一块空间。

将同一空间内容按不同形式输出

在这里插入图片描述

共用体的大小是:内部最大成员的大小,内部所有数据(c和i)共用一个空间;
同一时刻只有一个数据生效(i和c不能同时使用)。

联合体的大小也要考虑对齐
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值