#include <stdio.h>
int main()
{
//1.位域允许我们使用内存最小单位BIT位来存储数据,某些情况下可以为我们节省内存
//2.位域是以数据类型来区分区域的,几种数据类型就表示有几个位域段( 未指定占用位,除外 )
//3.同种位域类使用BIT位超过该位域数据类型大小自动完后继续占用该位域数据类型大小
//4.未用完的BIT位还是要占用内存空间的即不存在只使用int类型的其中4位,后面28位还是要占用空间的
//5.无法对位域成员变量取地址操作,因为我们无法取得某个BIT位的地址
//6.位域一般使用unsigned数据类型
//7.未指定占用位默认占用所有位数
//8.位域遵循结构体对齐原则
//看下面例子:
struct Test
{
//
//第一个位域区域为int可以用空间位数为sizeof( int ) * 8 = 32位
//刚好用完32位( 如果超过32位则自动往后移动32位即整个占用64位内存8字节大小 )
unsigned int a:4; //占用4位( 范围 0 - 2^4 -1 )
unsigned int b:5; //占用5位( 范围 0 - 2^5 -1 )
unsigned int c:3; //占用3位( 范围 0 - 2^3 -1 )
unsigned int d:16; //占用16位( 范围 0 - 2^16 -1 )
//
//
//第二个位域区域为char可以用空间位数为sizeof( char ) * 8 = 8位
//使用位数12位超过8位则自动往后移动8位即整个占用16位内存2字节大小 )
unsigned char e:5; //占用5位( 范围 0 - 2^5 -1 )
unsigned char f:7; //占用7位( 范围 0 - 2^7 -1 )
//
//
//第三个位域区域为short可以用空间位数为sizeof( short ) * 8 = 16位
//刚好用完16位
unsigned short g:10;
unsigned short h:6;
//
//第四个位域区域为char可以用空间位数为sizeof( char ) * 8 = 8位
//未指定占用位数默认占用所有位数
unsigned char i;
};
//整个结构体位域占用4 + 2 + 2 + 1 = 9个字节
//因为存在字节对齐则实际占用12个字节
Test t = {};
//不能这样使用
//unsigned int *p = &t.a;
const int size = sizeof( Test );
printf( "位域大小:%d字节\n", size );
return 0;
}
输出结果: