代码揭秘:位段操作
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) 一个位段必须存储在同一个存储单元,不能跨两个单元。