位字段
定义
位字段是C语言中一种存储结构,不同于一般结构体的是它在定义成员的时候需要指定成员所占的位数。
所有基础的数据类型, 最大的也不过 10 个字节;
我们可以自定义的数据类型 -- struct, 通过把若干类型组合在一起, 让一种类型可以大很多.
我们知道, 一个字节有八个 Bit 组成; struct中的 "位字段" 是以 Bit 为单位的, 这已经是计算机的最小单位, 大小是 char 类型的 1/8.
用途
它主要用于一些使用空间很宝贵的程序设计中,如嵌入式程序设计。
要点
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.无名位字段
结构中,还可以包括一个无名位字段,提供相邻成员之间的填充,强制结构体按word对齐。
4.包含位字段的结构和其他结构没有区别, 譬如同时包含其他类型的字段:
#include <stdio.h> struct Bit { unsigned b1: 1; unsigned b2: 1; float f; }B; int main(void) { B.b1 = 0; B.b2 = 1; B.f = 3.14; printf("%d, %d, %g\n", B.b1, B.b2, B.f); return 0; }
示例1
#include <stdio.h> struct Bit { unsigned a: 1; /* 1 Bit, 取值范围: 0 - 1 */ unsigned b: 2; /* 2 Bit, 取值范围: 0 - 3 */ unsigned c: 3; /* 3 Bit, 取值范围: 0 - 7 */ unsigned d: 4; /* 4 Bit, 取值范围: 0 - 15 */ }B; int main(void) { B.a = 1; B.b = 3; B.c = 7; B.d = 15; printf("%d, %d, %d, %d\n", B.a, B.b, B.c, B.d); return 0; }
示例2
#include <stdio.h> struct Bit { int b8: 1; int b7: 1; int b6: 1; int b5: 1; int b4: 1; int b3: 1; int b2: 1; int b1: 1; }B; int main(void) { unsigned char *p = NULL; B.b1 = 1; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 255 */ B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 0; B.b6 = 0; B.b7 = 0; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 1 */ B.b1 = 0; B.b2 = 0; B.b3 = 0; B.b4 = 0; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 15 */ B.b1 = 0; B.b2 = 1; B.b3 = 1; B.b4 = 1; B.b5 = 1; B.b6 = 1; B.b7 = 1; B.b8 = 1; p = (unsigned char *)&B; printf("%d\n", *p); /* 127 */ return 0; }