C语言中的一些关键字(十四)
来源:互联网 发布:linux物理内存分配 编辑:程序博客网 时间:2024/06/05 09:46
一、位段简介
有时,存储1个信息不必占用1个字节,只需二进制的1个(或多个)位就够用。如果仍然使用结构类型,则造成内存空间的浪费。为此,C语言引入了位段类型。
1. 位段的概念与定义 所谓位段类型,是一种特殊的结构类型,其所有成员均以二进制位为单位定义长度,并称成员为位段。
例如,CPU的状态寄存器,按位段类型定义如下:
struct status
{ unsigned sign: 1; /*符号标志*/
unsigned zero: 1; /*零标志*/
unsigned carry: 1; /*进位标志*/
unsigned parity: 1; /*奇偶/溢出标志*/
unsigned half_carry: 1; /*半进位标志*/
unsigned negative: 1; /*减标志*/
} flags;
显然,对CPU的状态寄存器而言,使用位段类型(仅需1个字节),比使用结构类型(需要6个字节)节省了5个字节。
2.说明
(1)因为位段类型是一种结构类型,所以位段类型和位段变量的定义,以及对位段(即位段类型中的成员)的引用,均与结构类型和结构变量一样。
(2)对位段赋值时,要注意取置范围。一般地说,长度为n的位段,其取值范围是:0~(2n-1)。
(3)使用长度为0的无名位段,可使其后续位段从下1个字节开始存储。
例如,
struct status
{ unsigned sign: 1; /*符号标志*/
unsigned zero: 1; /*零标志*/
unsigned carry: 1; /*进位标志*/
unsigned : 0; /*长度为0的无名位段*/
unsigned parity: 1; /*奇偶/溢出标志*/
unsigned half_carry: 1; /*半进位标志*/
unsigned negative: 1; /*减标志*/
} flags;
原本6个标志位是连续存储在1个字节中的。由于加入了1个长度为0的无名位段,所以其后的3个位段,从下1个字节开始存储,一共占用2个字节。
(4)1个位段必须存储在1个存储单元(通常为1字节)中,不能跨2个。如果本单元不够容纳某位段,则从下1个单元开始存储该位段。
(5)可以用%d、%x、%u和%o等格式字符,以整数形式输出位段。
(6)在数值表达式中引用位段时,系统自动将位段转换为整型数。
- C语言中的一些关键字(十四)
- C语言中的一些关键字(一)
- C语言中的一些关键字(五)
- C语言中的一些关键字(七)
- C语言中的一些关键字(九)
- C语言中的一些关键字(十)
- C语言中的一些关键字(十一)
- C语言中的一些关键字(十二)
- C语言中的一些关键字(十三)
- C语言中的一些关键字
- 【C语言天天练(十四)】const关键字详解
- 【C语言复习(十四)】C语言中的字符串
- C语言的一些关键字(二)
- C语言的一些关键字(三)
- C语言的一些关键字(四)
- C语言的一些关键字(八)
- C语言中的关键字
- C语言中的关键字
- vim插件vundle
- 图片的放大和缩小(不失帧)
- WebService之初体验
- 修改sql数据库默认端口(原1433端口)
- 改变态度,就能改变你的高度
- C语言中的一些关键字(十四)
- ATOM编辑器
- OfType的用法
- System V 消息队列
- BZOJ 2648 (kdtree)
- ios APNS 消息一直接收不到解决办法
- DLL内存加载
- nginx源码安装configure命令的参数介绍
- stm32f103zet6使用adc3通过dma2_5转换