注解:
位域:有些信息在存储时,并不需要占用一个完整的字节,而只需要占几个或一个二进制位,例如在存放开关量时,只有0和1两种状态,用1位二进制位即可。为了节省存储空间,并便于处理简便,C语言有提供了一种数据结构,称为位域或位段。
位域的写法:在结构体定义中,定义变量名的后面加上冒号加上限定的位数。
typedef struct {
short a;
short b;
short c:1; //位域,代表变量c只分配1bit的内存空间
short reserved : 15;
}_FORTEST;
问题:有如下代码
#include<stdio.h>
typedef struct {
short a;
short b;
short c:1; //使用位域,指示编译器c只用1位进行存储
short reserved : 15;
}_FORTEST;
int main()
{
_FORTEST f;
f.a = 100; f.b = 200; f.c = 1;
f.c &= 0x01;
printf("十进制:a = %d b = %d c = %d\r\n",f.a,f.b,f.c);
printf("十六进制:a = %#x b = %#x c = %#x",f.a,f.b,f.c);
return 0;
}
运行结果为
十进制:a = 100 b = 200 c = -1
十六进制:a = 0x64 b = 0xc8 c = 0xffffffff
其中
f.a = 100; f.b = 200; f.c = 1;
由于f.c占1位,所以f.c的补码即 1
f.c &= 0x01;
该语句使得f.c与0x01相与,所得结果为0x1(因为f.c仅占1位)
printf("十进制:a = %d b = %d c = %d\r\n",f.a,f.b,f.c);
printf("十六进制:a = %#x b = %#x c = %#x",f.a,f.b,f.c);
输出f.c时:都是要将f.c扩展至4字节(32bit),而此时f.c只有1bit,唯一剩下的数据位即代替符号位进行符号扩展,所以扩展后二进制补码为32个1,即为10进制的-1,以及16进制的0xffffffff