打印
[技术问答]

被忽略的C语言位段

[复制链接]
857|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Roderman_z|  楼主 | 2015-9-7 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
说真的,什么是“位段”,想当初自己还真的不是很了解,因为压根就用不着,更何况如今FLASH都是上512KB的容量,估计很少很少有人用到,但有时候还是非常有用的。

关键优势:
在一些经济型产品设计中,多一点浪费,少一点又不能完成项目需求,所以“能省就省,花最少的钱办最多的事”。采用位段结构既能够节省空间,而且又方便于操作。

位段定义
C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) ,这样利用位段能够用较少的位数存储数据。

应用举例:
例如在有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。比如我们经常会有开关量的使用,而它只有0和1两种状态,用一位二进位即可。我们正常直接一个字符型搞定,但如果用位段,我们一个字符却能够存8个开关量,总大小只有一个字节,而如果用字符型就要8个字节,这种优势十分明显啊。

如何定义:
--------------------------------------------------
struct 位域结构名
{ 位域列表 };

其中位域列表的形式为:
类型说明符位域名:位域长度
--------------------------------------------------
--------------------------------------------------
例如:
struct packed-data
{
  unsigned    a:2;
  unsigned b:6;
  unsigned c:4;
  unsigned d:4;
  int i;
}data;
--------------------------------------------------

存放方式:

a是字符型,占两位,说明data为packed-data变量,共占两个字节。其中位段a占2位,位域b占6位,位域c和d占4位。

终上所述,位段在本质上就是一种结构类型,其成员是按二进位分配的。

使用须知:
    1)位段的类型只能是int,unsigned int,signed int三种类型,不能是char型或者浮点型;

    2)位段占的二进制位数不能超过该基本类型所能表示的最大位数,比如在VC中int是占4个字节,那么最多只能是32位;

    3)无名位段不能被访问,但是会占据空间;

    4)不能对位段进行取地址操作;

    5)若位段占的二进制位数为0,则这个位段必须是无名位段,下一个位段从下一个位段存储单元(这里的位段存储单元经测试在VC环境下是4个字节)开始存放;

    6)若位段出现在表达式中,则会自动进行整型升级,自动转换为int型或者unsigned int。

    7)对位段赋值时,最好不要超过位段所能表示的最大范围,否则可能会造成意想不到的结果。

    8)位段不能出现数组的形式。

沙发
598330983| | 2015-9-7 22:53 | 只看该作者
什么是“位段?

使用特权

评论回复
板凳
gejigeji521| | 2015-9-8 15:28 | 只看该作者
位段不能出现数组的形式

使用特权

评论回复
地板
huangcunxiake| | 2015-9-8 19:52 | 只看该作者
我了个去,原来是如此理解啊,以前看头文件有,不懂

使用特权

评论回复
5
稳稳の幸福| | 2015-9-8 20:38 | 只看该作者
位段可以用来操作某个位,这个挺方便的。

使用特权

评论回复
6
Micachl| | 2015-9-8 21:28 | 只看该作者
C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或称“位域”( bit field) ,这样利用位段能够用较少的位数存储数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

354

帖子

2

粉丝