位域通过结构体来定义,该结构体为每个字段提供标签并确认该字段的长度。(位域就是把一个字节中的二进位划分为几个不同的区域,并说明每个位段的位数。每个位段都有一个域名,操作这个位段可以操作这个域名)
位域的宽度不能超过它所依附的数据类型的长度。
通俗地讲,成员变量都是有类型的,这个类型限制了成员变量的最大长度,后面的数字不能超过这个长度,如果超过长度,编译时会报错。
例如下面的 A,a 的类型是 unsigned int,长度为 4 个字节,共计 32 位,那么 a 后面的数字就不能超过 32;
如果a的类型是 unsigned char,长度为 1 个字节,共计 8 位,那么a 后面的数字就不能超过 8。
代码测试:
#include <iostream>
using namespace std;
struct A
{
unsigned int a : 1;//占用1位
unsigned int b : 4;//占用4位
unsigned int c : 2;//占用2位
unsigned int d : 4;//占用4位
};
int main()
{
int num = 9999;
struct A d;
memcpy(&d, &num,