首页 > 代码库 > 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结构体中位域