位段
位段类似于结构体,不过开辟空间有它的一套规律!
位段只能存储整型变量,常见的int,char,long,long long,以及它们的无符号形式。
以下操作在VS中进行!
情况1
#include<stdio.h>
typedef struct Node {
char _b : 5;//5个比特位
char _c : 2;//2个比特位
}Node;
int main()
{
Node n;
printf("%d\n",sizeof(n));
return 0;
}
运行结果是1个字节!
VS的处理方式:由于5+2小于8(一个字节),所以只申请了一个字节的空间。
#include<stdio.h>
typedef struct Node {
char _b : 5;//5个比特位
char _c : 8;//8个比特位
}Node;
int main()
{
Node n;
printf("%d\n",sizeof(n));
return 0;
}
运行结果是2字节!
VS的处理方式:由于5+8大于8(一个字节),所以申请了两个字节的空间。
情况二
#include<stdio.h>
typedef struct Node {
int _a : 2;//2个比特位
char _b : 5;//5个比特位
char _c : 2;//2个比特位
}Node;
int main()
{
Node n;
n._a = 20;
n._b = 20;
n._c = 20;
printf("%d\n", sizeof(int));
printf("%d\n",sizeof(n));
return 0;
}
#include<stdio.h>
typedef struct Node {
int _a : 2;//2个比特位
char _b : 5;//5个比特位
char _c : 8;//8个比特位
}Node;
int main()
{
Node n;
n._a = 20;
n._b = 20;
n._c = 20;
printf("%d\n", sizeof(int));
printf("%d\n",sizeof(n));
return 0;
}
由上面两个例子说明,int类型是4字节大小,char是1字节大小,编译器不考虑是否占满int申请的4个字节的内存空间,而是当两个类型不一致,直接再增加一个int大小的内存空间。
可以试试,long long类型和char类型。也是如此。
不推荐使用位段
- int类型是有符号还是无符号的问题;
- 位段的分配规则不确定;
- 是否要利用前一个变量剩余的比特位不确定;
- 16位机器和32位机器的最大位不确定。