首页 > 代码库 > C结构体中位域

C结构体中位域

  C结构体中位域的一点小知识,最近在看资料时遇到结构体中的一种特殊操作——位域,在下面的程序中我将根据自己的理解进行简单介绍。程序只是为了了解位域的一些性质,运行时有些编译器可能会报错。

  程序代码如下(C++编写),编译器使用的是C-Free,整型变量占4个字节。(由于刚接触,如有错误,还请大家指正。)

 1 #include<iostream> 2 using namespace std;  3  4 struct bit { 5     int a:3; 6     int b:2; 7     int c:3; 8 }; 9 10 int main () {11     struct bit s;12     char *c = (char*)&s;13     cout<<sizeof(s)<<endl;14     *c = 0x99;15     *(c+1) = 0x97;16     cout<<s.a<<endl<<s.b<<endl<<s.c<<endl;17     return 0;18 }

  程序第5-7行使用到了位域,成员a、b、c虽为整型,但是却明确限制了实际的长度,其中a为3个二进制位,b为2个二进制位,c为3个二进制位。程序的执行结果如下:

  第一个表示结构体的长度,由于3个成员实际都没有占用4个字节,所以实际的长度不是12。下面搞清了a、b、c实际的存储关系后就更加清楚了,位域变量在实际存储中是逆序存储的(不知道为什么),则实际的存储情况如图:3个变量一起正好组成一个字节的长度,程序第14行,*c=0x99,则:a = 001B,b = 11B,c = 100B。由于3个数都是整型,默认是带符号的,故a为1,b为-1,c为-4。

  如果是这样,那如果3个变量的长度多于8个二进制位呢,将结构体修改为如下(将b的二进制位改为3):

1 struct bit {2     int a:3;3     int b:3;4     int c:3;5 };

  这种情况下又该如何存储呢?由于一个字节不足以存放3个变量,那么c是分两个字节存储,还是直接存储在下一个字节的低位呢?运行上述程序,得到结果如下:

  c的结果是-2,如果是存储在下一个字节的话,c = 111B,对应的整型数应该为-1,但实际为-2,说明不是这种方式。在看分两个字节存储的方式,在这种方式下c = 110B,正好是-2。为了进一步确认,将程序第14行的赋值操作改为:*c = 0x59;

  执行后结果如下:

  这说明是分两个字节存储的,存储位置如下:

  由于编译器不同,处理的方式也有可能不同。

C结构体中位域