结构体位域及联合体解析
由于叙述不及代码演示,直接上代码;后面叙述下优缺点;
//结构体位域及联合体解析
//sizeof(s1)等于3。因为一个位域字段必须存储在其位域类型的一个单元所占空间中,不能横跨两个该位域类型的单元。
struct st1
{unsigned char a : 7; /*字段a占用了一个字节的7个bit*/unsigned char b : 2; /*字段b占用了2个bit*/unsigned char c : 7; /*字段c占用了7个bit*/
}s1;//sizeof(s2)等于2。因为a b 位域正好占用一个字节 8bit。因此一共占用两个字节
struct st2
{unsigned char a : 7; /*字段a占用了一个字节的7个bit*/unsigned char b : 1; /*字段b占用了2个bit*/unsigned char c : 7; /*字段c占用了7个bit*/
}s2;//联合体和结构体位域联用
union union_st3
{struct st2 X;unsigned short all; //两个字节,16bit
}union_t3;int main(void)
{s1.a = 15;s1.b = 3; //注意赋值不要超限,像s1.b占用2bit 取值范围:0-3;不然编译可能会报错s1.c = 0;printf("sizeof s1.b = %d\r\n",s1.b);union_t3.all = 0xffff;printf("sizeof s1.all = %d\r\n",union_t3.all);printf("sizeof union_t3.X.a = %d\r\n",union_t3.X.a);printf("sizeof union_t3.X.b = %d\r\n",union_t3.X.b);printf("sizeof union_t3.X.c = %d\r\n",union_t3.X.c);union_t3.all = 0x0f87;//0[000 1111] [1][000 0111] c:15 b:1 a:7printf("sizeof s1.all = %d\r\n",union_t3.all);printf("sizeof union_t3.X.a = %d\r\n",union_t3.X.a);printf("sizeof union_t3.X.b = %d\r\n",union_t3.X.b);printf("sizeof union_t3.X.c = %d\r\n",union_t3.X.c);printf("sizeof s1 = %d\r\n",sizeof(struct st1));printf("sizeof s2 = %d\r\n",sizeof(struct st2));
}
//执行结果:自己对照下打印顺序sizeof s1.b = 3
sizeof s1.all = 65535
sizeof union_t3.X.a = 127
sizeof union_t3.X.b = 1
sizeof union_t3.X.c = 127
sizeof s1.all = 3975
sizeof union_t3.X.a = 7
sizeof union_t3.X.b = 1
sizeof union_t3.X.c = 15
sizeof s1 = 3
sizeof s2 = 2
- 优点:可以把一个变量拆分成位域,省时省空间,再结合联合体,完美;
- 缺点:不同系统对位域的处理可能有不同的结果,如位段成员在内存中是从左向右分配的还是从右向左分配的,所以位域的使用不利于程序的可移植性。
结构体位域及联合体解析相关推荐
- c语言结构体语法分析,C语言结构体struct的语法解析
本节内容需要结合视频讲解才能更容易理解,视频播放地址如下: 用java开发编译器 本节,我们着重研究结构体定义,也就是struct 这种变量定义,C语言编译器是如何解析的,本节我们要解析的结构体定义如 ...
- C语言结构体struct的语法解析
本节内容需要结合视频讲解才能更容易理解,视频播放地址如下: 用java开发编译器 本节,我们着重研究结构体定义,也就是struct 这种变量定义,C语言编译器是如何解析的,本节我们要解析的结构体定义如 ...
- 原创 OC底层 - runtime 结构体+位域
使用结构体位域: #import "Student.h"@interface Student() {//一个字节 可以表示8个BOOL变量/**位域*/struct{char ti ...
- 结构体类型、联合体类型
结构体和联合体 一.结构体类型 1. 结构体类型的设计和初始化 2. 结构体大小的计算 3. 结构体成员的访问和赋值 4. 结构体类型和指针 (1)变量名为指针时: (2)结构体赋值时容易出现的问题: ...
- cjson 对象是json数组型结构体_cJSON创建并解析json结构体 | 学步园
cJSON 对于cJSON的使用,我主要是用来模拟远程服务器端返回的一个json类型的目录结构,客户端进行获取并进行解析,把解析出来的目录按照原本的结构显示在本地. cJSON简介 cJSON是一个超 ...
- c语言结构体位定义,C语言结构体位域
1.定义声明 位段成员必须声明为int.unsigned int或signed int类型(shortcharlong).位域的定义和位域变量的说明位域定义与结构定义类似,其形式为: struct 位 ...
- bool c语言_C/C++编程笔记:C语言结构体—位域,如何指定成员变量所占Bit?
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可.比如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.正是基于这种考虑,C语言又提供了一种叫做位域 ...
- 结构体 位段 枚举 联合体
结构体对齐规则: 1.第一个成员在结构体变量偏移量为0的地址处 2.其他成员变量要对齐到对齐数的整数倍的地址处 对齐数=编译器默认对起数 和 成员字节大小中的较小值 3.结构体总大小为最大对齐数的整数 ...
- 【C语言进阶】结构体 位段 枚举 联合体详解
目录 1.结构体 1.1结构体的基础类型 1.2结构的声明 1.3特殊的声明 1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6结构体内存对齐(计算结构体的大小) 1.6.1 结构体对齐规则 ...
最新文章
- UML工具 MAGICDraw
- QAU 18校赛 J题 天平(01背包 判断能否装满)
- 003、关于Integer.valueOf(sss)与Integer.parseInt(sss)性能
- LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
- 判断两个图片的特征向量_自媒体图文写多少字效果最好?多少张图片最合适?...
- IronRuby 发布第一个版本
- LTE学习:MCS(调制与编码策略) CSI(信道状态信息)
- 官方实力榜:绿军居首黄蜂第二 火箭小降雄鹿飙升
- ASP.Net中控件的EnableViewState属性
- 【python初级】 ubuntu18.04下卸载Anaconda3
- 绝对值函数可导点的判断
- cloudfare dns_Cloudflare配置动态dns(ddns)
- 蓝桥杯科学素养刷题和分析
- Urllib2库+正则爬取内涵段子
- Information Communication Technology,简称ICT
- python学习 —— post请求方法的应用
- 低功耗wifi可视门铃方案全球推广
- C++ vector函数
- sketch里的ios控件_Sketch效率实现飞跃般的提升?先收下这些Symbol技巧
- 一篇文章教会大家制作小程序,利用小程序创业。