知识补充(1)-位域

        今天在牛客上找到了前几天做的有关c语言的题,发现这个题涉及到了位域的知识,之前也没接触过这样的知识,故前去学习,并进行总结,发了这篇文章,方便之后再进行复习。

知识补充(1)-位域_第1张图片

        位域可以用在嵌入式领域,在结构体中定义,可以在数据存储时节省空间。

        在c语言标准中(ANSI C)支持的是unsigned int与int。有的编译器进行了拓展,支持其它类型的如char等。

        在结构体的成员变量后面加上“:”再在后面加上你所定义的变量所占的位数(bit),这样就可以让一个本来应该占4字节32位的变量占你希望它占的位数(不能超过数据类型本身大小,如int的32位,冒号后面不能超过32),这也就是位域。

        如果多个这样定义的变量在一起,会进行压缩存储,直到多个变量占空间之和大于数据类型代表空间时就会进行偏移,偏移量为数据类型所占空间大小的整数倍。当定义位域的变量中间有非位域变量,则不会进行压缩存储。而不同类型变量定义的位域是否被压缩存储取决于你的编译器(gcc会压缩,vc不会)。

        上面那道题三个int类型变量在一起,位域分别为3,4,5,相加12位不超过int类型的32位,所以就相当于占了一个int的大小4个字节(进行了压缩存储)。又根据内存对齐原理,知道这个结构体中每个存储单元为8字节(double),所以前三个变量共占8字节,与后面double类型8字节相加,共占16字节。

        如果第二个定义的位域是29,那么就应该占两个int的大小,因为前两个变量经压缩存储后位域已经等于32,最后一个变量需要另开空间;如果第二个定义的位域为30,那前三个所占空间为3个int的空间,因为第二个变量既无法与第一个变量压缩存储,也无法与第三个变量压缩存储,都大于32,所以,前三个变量所占空间大小为3个int,即12个字节。

 

你可能感兴趣的:(c++,c语言)