文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
位字段的位数可调
可以用位字段(bitfield)指定一个字段有多少位。例如,可以把结构写成这样:
如果你有一连串的位字段,计算机会放在一起,以节省空间,也就是说如果有 8 个 1 位的位字段,计算机就会把它们保存在一个字节中。
让我们看看如何巧用位字段。
只有出现在同一个结构中,位字段才能节省空间。
如果编译器发现结构中只有一个位字段,还是会把它填充成一个字,这就是为什么位字段总是组合在一起。
如何选择位数?
位字段不仅可以用来保存一连串真/假值,还可以用来保存小范围的数字,例如一年中的十二个月。假设想在某个结构中保存月份(0 到 11 的值),就可以用一个 4 位的位字段来保存,为什么?因为 4 位可以保存 0 到 15,而 3 位只能保存 0 到 7。
...unsigned int month_no:4;...
练习
回到 Head First 水族馆,工作人员正在对顾客进行满意度调查,你能否利用位字段创建相应的结构?
练习解答
回到 Head First 水族馆,工作人员正在对顾客进行满意度调查,请利用位字段创建相应的结构。
这里没有蠢问题问:为什么 C 语言不支持二进制字面值?答:因为二进制字面值占了很大空间,而且十六进制通常写起来更快。问:为什么保存一个 0 到 10 的值需要 4 位?答:4 位可以保存 0 到二进制数 1111(也就是 15)的值,但 3 位最大只能保存二进制数 111(也就是 7)。问:如果我把 9 放到一个 3 位的字段中会怎样?答:计算机会保存 1,因为 9 的二进制是 1001,所以计算机转换成 001。问:位字段就是为了节省空间的吗?答:不仅仅是为了节省空间,如果需要读取低层的二进制信息,位字段就会非常有用。问:能举个例子吗?答:比如要读写某类自定义二进制文件。
要点
可以用联合在同一个存储器单元中保存不同数据类型。
“指定初始化器”按名设置字段的值。
C99 标准支持“指定初始化器”,C++不支持。
如果用{花括号}中的值初始化联合,这个值会以第一个字段的类型保存。
你完全可以读取联合中未初始化过的字段,编译器不会干涉。但要小心,因为这么做很有可能会出错。
枚举保存符号。
可以用位字段自定义字段的位数。
位字段应当声明为
unsigned int 。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论