由于叙述不及代码演示,直接上代码;后面叙述下优缺点;

//结构体位域及联合体解析
//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
  • 优点:可以把一个变量拆分成位域,省时省空间,再结合联合体,完美;
  • 缺点:不同系统对位域的处理可能有不同的结果,如位段成员在内存中是从左向右分配的还是从右向左分配的,所以位域的使用不利于程序的可移植性。

结构体位域及联合体解析相关推荐

  1. c语言结构体语法分析,C语言结构体struct的语法解析

    本节内容需要结合视频讲解才能更容易理解,视频播放地址如下: 用java开发编译器 本节,我们着重研究结构体定义,也就是struct 这种变量定义,C语言编译器是如何解析的,本节我们要解析的结构体定义如 ...

  2. C语言结构体struct的语法解析

    本节内容需要结合视频讲解才能更容易理解,视频播放地址如下: 用java开发编译器 本节,我们着重研究结构体定义,也就是struct 这种变量定义,C语言编译器是如何解析的,本节我们要解析的结构体定义如 ...

  3. 原创 OC底层 - runtime 结构体+位域

    使用结构体位域: #import "Student.h"@interface Student() {//一个字节 可以表示8个BOOL变量/**位域*/struct{char ti ...

  4. 结构体类型、联合体类型

    结构体和联合体 一.结构体类型 1. 结构体类型的设计和初始化 2. 结构体大小的计算 3. 结构体成员的访问和赋值 4. 结构体类型和指针 (1)变量名为指针时: (2)结构体赋值时容易出现的问题: ...

  5. cjson 对象是json数组型结构体_cJSON创建并解析json结构体 | 学步园

    cJSON 对于cJSON的使用,我主要是用来模拟远程服务器端返回的一个json类型的目录结构,客户端进行获取并进行解析,把解析出来的目录按照原本的结构显示在本地. cJSON简介 cJSON是一个超 ...

  6. c语言结构体位定义,C语言结构体位域

    1.定义声明 位段成员必须声明为int.unsigned int或signed int类型(shortcharlong).位域的定义和位域变量的说明位域定义与结构定义类似,其形式为: struct 位 ...

  7. bool c语言_C/C++编程笔记:C语言结构体—位域,如何指定成员变量所占Bit?

    有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可.比如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.正是基于这种考虑,C语言又提供了一种叫做位域 ...

  8. 结构体 位段 枚举 联合体

    结构体对齐规则: 1.第一个成员在结构体变量偏移量为0的地址处 2.其他成员变量要对齐到对齐数的整数倍的地址处 对齐数=编译器默认对起数 和 成员字节大小中的较小值 3.结构体总大小为最大对齐数的整数 ...

  9. 【C语言进阶】结构体 位段 枚举 联合体详解

    目录 1.结构体 1.1结构体的基础类型 1.2结构的声明 1.3特殊的声明 1.4结构体的自引用 1.5结构体变量的定义和初始化 1.6结构体内存对齐(计算结构体的大小) 1.6.1 结构体对齐规则 ...

最新文章

  1. UML工具 MAGICDraw
  2. QAU 18校赛 J题 天平(01背包 判断能否装满)
  3. 003、关于Integer.valueOf(sss)与Integer.parseInt(sss)性能
  4. LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
  5. 判断两个图片的特征向量_自媒体图文写多少字效果最好?多少张图片最合适?...
  6. IronRuby 发布第一个版本
  7. LTE学习:MCS(调制与编码策略) CSI(信道状态信息)
  8. 官方实力榜:绿军居首黄蜂第二 火箭小降雄鹿飙升
  9. ASP.Net中控件的EnableViewState属性
  10. 【python初级】 ubuntu18.04下卸载Anaconda3
  11. 绝对值函数可导点的判断
  12. cloudfare dns_Cloudflare配置动态dns(ddns)
  13. 蓝桥杯科学素养刷题和分析
  14. Urllib2库+正则爬取内涵段子
  15. Information Communication Technology,简称ICT
  16. python学习 —— post请求方法的应用
  17. 低功耗wifi可视门铃方案全球推广
  18. C++ vector函数
  19. sketch里的ios控件_Sketch效率实现飞跃般的提升?先收下这些Symbol技巧
  20. 一篇文章教会大家制作小程序,利用小程序创业。

热门文章

  1. win10 mysql8.0.12 忘记root密码如何重置密码
  2. Mac之当前目录打开终端
  3. 同步降压DC-DC转换IC——XC9264
  4. perf之sched
  5. Zabbix server is not running 报错的排查
  6. Mac及Xcode常用快捷键
  7. Unity3D TestTool Part _1
  8. Good Technology 产品特色
  9. 修复boot分区文件被删除的方法
  10. flashcom网址收集