位段
位段也是一种结构体类型,是申请二进制位
- 成员必须是int,unsigned int,或signed int,char
- 成员名后有一个冒号和一个数字
- 位段的空间上是按照需要,以int或char开辟
- 位段不能跨平台
- a需要2个比特位,b需要5个比特位,c需要10个比特位,d需要30个比特位
内存分配 - 先给a开辟4个字节,使用2个比特位,b使用5个比特位,c用10个,对于d就不够了,然后再开辟4个字节
计算位段所占空间大小
- 成员变量不能跨字节存储
- 成员变量不能跨类型存储(总大小要考虑字节对齐)
- 成员变量后所标注的所占字节数不能超过字节本身比特位
- 在存储数据时注意二进制位的丢失
数据的存储
位段的跨平台问题
- int 位段被当成有符号数还是无符号数是不确定的。(编译器将最高位是否是符号位不确定)
- 位段中最大位的数目不能确定。(32位机器最大32个比特位,冒号后写33,就会出现错误)
- 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
- 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是否舍弃剩余的位还是利用,这是不确定的。
枚举:
把可能的取值一一列举出来,关键字 enum
定义一个枚举类型,枚举取值是常量,常量不能被修改,但是可以赋初始值
#define与emun
- #define定义的是符号,在后续的预处理阶段会将代码替换成0,1,2,调试与代 码执行不同;不能调试
- 用emun实现,Mon是有类型的更严谨
- 防止命名冲突
- 枚举更方便使用
枚举类型是4个字节,不论里面有多少数据,因为枚举每次只为其中一个类型开辟空间
共用体(联合体):
一种特殊的自定义类型,这种类型定义的变量也包含一系列的成员,特征是这些成员公用一块空间。
将同一空间内容按不同形式输出
共用体的大小是:内部最大成员的大小,内部所有数据(c和i)共用一个空间;
同一时刻只有一个数据生效(i和c不能同时使用)。
联合体的大小也要考虑对齐