代码揭秘:位段操作

C语言中还提供了另外一种更直观、更方便的操作方法---------“位段”。C语言中以位为单位来指定某结构体中的成员变量是可以的,这种特殊结构体中的成员就是“位段”。例如:

    struct packed_data
{
    unsigned a:4;
    unsigned b:4;
    unsigned c:6;
    unsigned d:2;
    int i;
}

上述结构体中各成员在内存中的存储情况:成员a、b、c、d分别占用2位、4位、4位和2位 下面用一段程序来演示位段的使用方式:

      struct packed_data
   {
    unsigned a:2;
    unsigned b:3;
    unsigned c:4;
    int i;
   }data;
   data.a = 3;
  data.b = 7;
  data.c = 10;
 data.i = 118;
printf("a = %d, b = %d, c = %d\n", data.a, data.b, data.c);
  std::cout << "Press Enter or Return to exit:";
 std::cin.get();
   return 0;

不过,在使用位段操作时需要注意几点: (1) 位段成员的类型能够且仅能够指定为unsigned或int类型 (2) 如果某一位段要人另一个字节开始的地方存放,则可以使用以下形式定度: unsigned a:1; unsigned b:3; unsigned :0; unsigned c:4; 在上面的定义中,加入了一个长度为0的成员。这样其后的一个成员就不会接着前面的成员而连续存放,它将从下一个存储单元开始存放。最终结果是成员a和b被存放在一个存储单元,成员c被存放在另外一个独立的单元里。 (3) 位段的长度不能大于存储单元的长度,它不能定义位段数组。 (4) 可以定义无名位段。 unsigned a:1; unsigned :3; //无名位段 unsigned c:0; 成员a后面出现了无名位段,它占据3位空间,该空间不被使用。 (5) 一个位段必须存储在同一个存储单元,不能跨两个单元。