位段:位域
直接来看几个结构体,猜测一下他们的大小都应该是多少?
我们先来分析一下:
对于第一个结构体Date而言,int类型是四个字节也就是32个位,而我们这里只是对int类型,分了位域,也就是只用到了一个int类型,所以struct Date的大小就是4。
对于第二个结构体X而言,char类型是一个字节也就是8个位,char a 占了三个位,char b 占了二个位,那对于此时的char而言就只剩下了三个位,而char c 要占五个位,所以要再占一个字节,最终struct X的大小就是2。
对于第三个结构体Y而言,char类型是一个字节也就是8个位,char a 占了三个位,char b 占了四个位,char c 要占一个位,刚好把char的位占满,所以此时struct Y的大小就是1+1+2+4=8。
对于第四个结构体A而言,char类型是一个字节也就是8个位,char a 占了三个位,char b 占了二个位,那对于此时的char而言就只剩下了三个位,而char c 要占五个位,所以要再占一个字节,char d 要占四个位,上一个char c留下的三个位不够,所以又要再占一个char,最终struct A的大小就是3。
#include<stdio.h>
struct Date
{
unsigned int year:23; //23位二进制位
unsigned int month:4; //1-12 4位二进制位
unsigned int day:5; //1-31 5位二进制位
};
struct X
{
char a:3;
char b:2;
char c:5;
};
struct Y
{
char a:3;//char:数字不能大于8
char b:4;
char c:1;
short e;
int d;
};
struct A
{
unsigned char a:3; //无符号的char类型,应该占一个字节八个位,但是此处用到了位域,所以a只占了三个位
char b:2; //char类型,应该占一个字节八个位,但是此处用到了位域,所以b只占了二个位
unsigned char c:5;//无符号的char类型,应该占一个字节八个位,但是此处用到了位域,所以c只占了五个位
char d:4;//char类型,应该占一个字节八个位,但是此处用到了位域,所以d只占了四个位
};
int main()
{
printf("%d\n", sizeof(Date));
printf("%d\n", sizeof(X));
printf("%d\n", sizeof(Y));
printf("%d\n", sizeof(A));
return 0;
}
调试结果如下:
和我们上边分析的结果一致。