在内存中存取数据的最小单位一般是字节,但是有时候并不需要一个字节来存储。例如对于只有真假两个值得一个变量来说,就只须一位就可以了。有比如说在某些情况下内存是极其宝贵的资源,比如说一些嵌入式设备,因此要格外的注意节约。C语言可以在一个结构体中以位来存储数据,这种用位为单位的成员称为位域或位段。
struct bit_data
{
int a:2;
char c:3;
};
虽然位域的机制提供了一种使用非字节数内存的方法,但是位域在使用的时候还是要注意一些问题的,比如说,位域成员的长度不能超过其自身声明类型的长度char不能超过8,下面是两个比较主要的问题:
(1)成员值的问题
声明一个位域如下
struct bool
{
int a:1;
};
希望声明一个这样的位域用他来充当bool型,但是实际的情况却和想象的不一样。赋1,输出得到的切实-1。这是因为在二进制补码中,最高有效位也称为符号位,当被设置为1时,表示负数,而当被设置为0时,值为非负。这里只有一位,那么他自身就是最高有效位,那么赋1他就是负数,在这里是-1,而0则是0这个非负数。下面是一个完整的测试程序。<