栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

位域结构体操作

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

位域结构体操作

定义:位域结构体和结构体类似,只是变量a:1,这个表示a占一位,但本身a是4个字节大小,并且成员存储是从低到高,
struct
{
unsigned int a:1;
unsigned int b:1;
unsigned int u:1;
unsigned int i:1;
}prnt;
#include

struct pack
{
unsigned a:2; // 取值范围为:0~3 ///这个范围是位数所能表示的最大是数值范围,2的2次方,表示4个数,就是从0-3
unsigned b:4; // 取值范围为:0~15
unsigned c:6; // 取值范围为:0~63
};

int main(void)
{
struct pack pk1;
struct pack pk2;

// 给pk1各成员赋值并打印输出
pk1.a = 1;
pk1.b = 10;
pk1.c = 50;
printf("%d, %d, %dn", pk1.a, pk1.b, pk1.c);

// 给pk2各成员赋值并打印输出
pk2.a = 5;
pk2.b = 20;
pk2.c = 66;
printf("%d, %d, %dn", pk2.a, pk2.b, pk2.c);

return 0;
}

位域存储:会出现字节对齐,
#include
struct pack
{
unsigned a:2;
unsigned b:4;
unsigned c:6;
};
int main(void)
{
printf(“sizeof(struct pack) = %d”, sizeof(struct pack));
return 0;
}

程序输出结果为:

sizeof(struct pack) = 4
解析:a,b,c总共占12bit,一个字节不到,所以会全部放在一个字节,由低向高,而最小变量类型就是 4个字节为单位,所以最后结果是4,

例子2:
struct pack
{
unsigned a:12;
unsigned b:24;
unsigned c:6;
};
结果: sizeof(struct pack) = 8
最小对齐类型:4字节,a.b超了一个类型,所以a,独占一个4字节,然后b.c刚好在一个最小类型里面,共同占4,最后结果8字节
例子3:

可见最小类型:16位,但后面控制的位需要两个类型(一个类型2字节),所以该结构体大小:4个字节

例子4:自动对齐,当成员控制位与最小类型单元填满


上述可见,c控制3位是在这个寄存器中间,但似乎在结构体中,并没有按从低到高顺序,定义这个位成员,这就是所有成员刚好对应,没有重复的,比如要是有两个3位控制成员呢,就不能对应到那个3,位,所以只有一个,读出来的值就是c就是唯一的那个三位,

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/317131.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号