Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1241583
  • 博文数量: 510
  • 博客积分: 20296
  • 博客等级: 上将
  • 技术积分: 4680
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-30 03:58
文章存档

2011年(13)

2010年(92)

2009年(242)

2008年(163)

我的朋友

分类: C/C++

2008-05-25 01:42:59

位字段(bit-field),或简称字段,是“字”中相邻的集合。“字”(word)是单个的存储单元,它同具体的实现有关。

 

如下:

1  struct
2  {
3      unsigned int is_keyword : 1;
4      unsigned int is_extern : 1;
5      unsigned int is_static : 1;
6  }flags;

 

这里定义了一个变量 flags,它包含了3个一位的字段。冒号后面的数字表示字段的宽度(用二进制位数表示)。字段被声明为unsigned int类型,以保证它们是无符号量。

 

1) 位字段所允许的类型。

 

C语言允许unsigned int类型,signed int类型或int类型的位字段,分别称为无符号位段,带符号位字段和普通位字段。和普通字符一样,普通位字段可以无符号或带符号C99允许_Bool类型的位字段 

 

 

要分别实现无符号位字段或带符号位字段来保存无符号值或带符号值。

例如:考虑下面标准C语言声明在采用对二的补码为编码方式的计算机中的效果

 

struct S
{
    unsigned a:3;
    signed b:3;
    int c:3;
}t = {-1, -1, -1};

        此时t.a,t.b,t.c的值分别为7-1-1

 

2) 位字段的存储方式:是从左向右还是从右向左,即是用“高位存储法”还是“低位存储法

 

由于上面的原因,采用位字段的程序,依赖这些因素,程序是不可移植的。

 

3) 无名位字段。

 

结构中,还可以包括一个无名位字段,提供相邻成员之间的填充。无名位字段不能引用,运行时无名位字段的内容是无法预测的。

对无名位字段指定长度0,具有特殊意义:表示存储前一位字段的区中不能再放置更多的位字段。

 

4)位字段不是数组,并没有地址,因此不能对它们使用&运算符。

阅读(1487) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~