当前位置: 首页 > news >正文

由浅到深认识C语言(12):位段/位域

该文章Github地址:https://github.com/AntonyCheng/c-notes

在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.csdn.net/AntonyCheng/article/details/136555245),该模板集成了最常见的开发组件,同时基于修改配置文件实现组件的装载,除了这些,模板中还有非常丰富的整合示例,同时单体架构也非常适合SpringBoot框架入门,如果觉得有意义或者有帮助,欢迎Star & Issues & PR!

上一章:由浅到深认识C语言(11):结构体

12.位段/位域

这里需要记住,在内存中数据插入输出的顺序,即逆序插入,顺序输出!详解在8.3指针变量中变量的类型;

问题提出:信息在计算机的存取长度一般以 Byte 为单位,但是有时候存储一个信息不必用到一个或者多个 Byte,例如”真“或”假“用 1 或 0 表示即可,只需要 1 bit,此时我们就需要使用位段

**定义:**C语言允许在一个结构体中以 bit 为单位来指定其成员所占内存长度,以 bit 为单位的成员称为”位段“或称”位域“,而且这些成员的数据类型大都为 unsigned int ,也可以用 unsigned char

格式示例如下:

struct data
{unsigned int a : 2;		//a占2位unsigned int b : 6;		//b占6位unsigned int c : 4;		//c占4位unsigned int d : 4;		//d占4位unsigned int i;			//i占32位
}data;

图解如下:

idcba
32bit4bit4bit6bit2bit

而且相邻位域是可以被压缩的,且相邻位域压缩的位数不能超过成员自身的大小;

解释如下: 以下数据类型仅为 unsigned int 和 unsigned char;

若相邻成员数据类型相同(可压缩):

  • 如果我们使用的是 unsigned int 类型,最多能够压缩 32 个连续的 unsigned int num : 1; 即最多压缩 320/1 编码,如果连续的相同数据类型成员位数超过了 4B ,即 32b ,如果大小溢出了 4B ,即大于等于了 33b 的话,进而成为 8B ,如果只压缩了 33unsigned int num : 1 ,无论打印出来是多少 B ,实际大小还是为 33b ,往后以此类推;

  • 如果我们使用的是 unsigned char 类型,最多能够压缩 8 个连续的 unsigned char ch : 1; 即最多压缩 80/1 编码,如果连续的相同数据类型成员位数超过了 1B ,即 8b ,如果大小溢出了 1B ,即大于等于了 9b 的话,进而成为 2B ,如果只压缩了 9unsigned char ch : 1 ,无论打印出来是多少 B ,实际大小还是为 9b ,往后以此类推;

若相邻成员数据类型不同(不可压缩):

不相邻的两个成员或者两类成员,则既要将两类数据内存按照 int 或者 char 基本数据类型的内存进行加减,又要将每一类中的各个成员内存进行压缩;

示例如下:

#include<stdio.h>
#pragma pack(1)
struct bit_data
{unsigned char a : 1;unsigned char b : 1;unsigned char c : 1;unsigned char d : 1;unsigned char e : 1;unsigned char f : 1;unsigned char g : 1;unsigned char h : 1;
}data;int main(int argc, char* argv[]) {printf("data = %d\n", sizeof(data));
}

打印效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

12.1.位段的注意事项

  • 位段不能取地址:

    因为内存地址是以 Byte 为单位,因为系统内存是以 Byte 为基本单位,系统不会识别在 bit 上的地址;

  • 位段的赋值:

    不要操作越界的数据,解释如下:

    #include<stdio.h>struct bit_data
    {unsigned char a : 1;	//0-1				==>		0-1unsigned char b : 2;	//00-11				==>		0-3unsigned char c : 3;	//000-111			==>		0-7unsigned char d : 4;	//0000-1111			==>		0-15unsigned char e : 5;	//00000-11111		==>		0-31unsigned char f : 6;	//000000-111111		==>		0-63unsigned char g : 7;	//0000000-1111111	==>		0-127unsigned char h : 8;	//00000000-11111111	==>		0-255
    }data;int main(int argc, char* argv[]) {data.a = 1;printf("%u\n", data.a);data.b = 3;printf("%u\n", data.b);data.c = 7;printf("%u\n", data.c);data.d = 15;printf("%u\n", data.d);data.e = 31;printf("%u\n", data.e);data.f = 63;printf("%u\n", data.f);data.g = 127;printf("%u\n", data.g);data.h = 255;printf("%u\n", data.h);
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 无意义位段:

    无意义位段用来限制压缩,解释如下:

    以下示例将位段定义成了全局变量,可以不用初始化为零值(因为全局变量会自动初始化),但是如果将该位段定义成局部变量,那么就需要我们手动初始化为零,因为局部变量载入时是一个不确定的值;

    struct bit_data
    {unsigned char a : 2;unsigned char : 2;    //无意义的位段,仅作占位符,占两个 bitunsigned char b : 2;unsigned char c : 2;
    }data;
    

    图示如下:

    ccbbaa

    验证如下:

    #include<stdio.h>
    #include<string.h>
    struct bit_data
    {unsigned char a : 2;unsigned char : 2;    //无意义的位段,仅作占位符,占两个 bitunsigned char b : 2;unsigned char c : 2;
    }data;int main(int argc, char* argv[]) {//如果是定义成了局部变量,还需要包含string.h头文件,然后://memset(&data,0,1);data.a = 0;data.b = 2;data.c = 3;//此时data转换成二进制为 1110 0000 ==> 十六进制 0xe0printf("data = %#x\n",data);
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 另起一个位段:

    当我们将无意义位段设置为 0 时,我们就成功另起了一个位段,即在内存的另一处重新开辟了一个容器来装下一个位段的内容,证明如下:

    #include<stdio.h>
    #include<string.h>
    typedef struct data{unsigned char a : 2;unsigned char : 0;unsigned char b : 2;unsigned char : 0;unsigned char c : 2;unsigned char : 0;unsigned char d : 2;
    }DATA;int main(int argc, char* argv[]) {DATA data;memset(&data, 0, 4);//此时这个结构体里包含了四个位段地址printf("sizeof(data) = %d\n", sizeof(data));data.a = 0;data.b = 1;data.c = 2;data.d = 3;printf("%x\n", data);
    }
    

    打印效果如下:

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

12.2.位域和单片机

图解如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码如下:

#include<stdio.h>typedef struct {unsigned char data : 1;unsigned char : 1;unsigned char addr : 2;unsigned char : 1;unsigned char opt : 2;unsigned char : 1;
}DATA;int main(int argc, char* argv[]) {//下面是单片机定义DATA msg;msg.data = 1;msg.addr = 2;msg.opt = 1;
}

上一章:由浅到深认识C语言(13):共用体

相关文章:

由浅到深认识C语言(12):位段/位域

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…...

antd5 虚拟列表原理(rc-virtual-list)

github:https://github.com/react-component/virtual-list rc-virtual-list 版本 3.11.4(2024-02-01) 版本&#xff1a;virtual-list-3.11.4 Development npm install npm start open http://localhost:8000/List 组件接收 Props PropDescriptionTypeDefaultchildrenRender …...

机器学习-04-分类算法-03KNN算法

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中分类算法&#xff0c;本篇为分类算法与knn算法部分。 本门课程的目标 完成一个特定行业的算法应用全过程&#xff1a; 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程化…...

Learn OpenGL 08 颜色+基础光照+材质+光照贴图

我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色&#xff0c;而是它所反射的(Reflected)颜色。物体的颜色为物体从一个光源反射各个颜色分量的大小。 创建光照场景 首先需要创建一个光源&#xff0c;因为我们以及有一个立方体数据&#xff0c;我们只需要进行…...

springboot多模块下swaggar界面出现异常(Knife4j文档请求异常)或者界面不报错但是没有显示任何信息

继上一篇博文&#xff0c;我们解决了多模块下扫描不到子模块的原因,建议先看上一个博客了解项目结构&#xff1a; springboot 多模块启动报错Field XXX required a bean of type XXX that could not be found. 接下来我们来解决swaggar异常的原因&#xff0c;我们成功启动项目…...

【系统架构设计师】系统工程与信息系统基础 01

系统架构设计师 - 系列文章目录 01 系统工程与信息系统基础 文章目录 系列文章目录 前言 一、系统工程 ★ 二、信息系统生命周期 ★ 信息系统建设原则 三、信息系统开发方法 ★★ 四、信息系统的分类 ★★★ 1.业务处理系统【TPS】 2.管理信息系统【MIS】 3.决策支持系统…...

python自动化之(django)(2)

1、创建应用 python manage.py startapp apitest 这里还是从上节开始也就是命令行在所谓的autotest目录下来输入 然后可以清楚的看到 多了一个文件夹 2、创建视图 在views中加入test函数&#xff08;所建应用下&#xff09; from django.http import HttpResponse def tes…...

C语言 内存函数

目录 前言 一、memcpy()函数 二、memmove()函数 三、memset函数 四、memcmp()函数 总结 前言 在C语言中内存是我们用来存储数据的地址&#xff0c;今天我们来讲一下C语言中常用的内存函数。 一、memcpy()函数 memcpy()函数与我们之前讲的strcpy()函数类似&#xff0c;只…...

145 Linux 网络编程1 ,协议,C/S B/S ,OSI 7层模型,TCP/IP 4层模型,

一 协议的概念 从应用的角度出发&#xff0c;协议可理解为“规则”&#xff0c;是数据传输和数据的解释的规则。 典型协议 传输层 常见协议有TCP/UDP协议。 应用层 常见的协议有HTTP协议&#xff0c;FTP协议。 网络层 常见协议有IP协议、ICMP协议、IGMP协议。 网络接口层 常…...

【Java】List, Set, Queue, Map 区别?

目录 List, Set, Queue, Map 区别&#xff1f; Collection和Collections List ArrayList 和 Array区别&#xff1f; ArrayList与LinkedList区别? ArrayList 能添加null吗&#xff1f; ArrayList 插入和删除时间复杂度&#xff1f; LinkedList 插入和删除时间复杂度&…...

打卡学习kubernetes——了解k8s基本概念

目录 1 Container 2 Pod 3 Node 4 Namespace 5 Service 6 Label 7 Annotations 8 Volume 1 Container Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术。它使用namespace隔离不同的软件运行环境&#xff0c;并通过镜像自包含软件的运行环境&#xff0c;从而…...

特殊内齿轮加工的另一种选择

内齿轮加工普遍采用插齿或拉削&#xff0c;但对于一些特殊齿廓的内齿轮来说&#xff0c;插齿可能会有一定的困难&#xff0c;或者成本较高。在这种情况下&#xff0c;线切割加工不失为一种不错的选择。那么什么样的零件需要选择这种加工方式呢&#xff1f;一起来看看&#xff1…...

Visual Studio配置libtorch(cuda安装一步到位)

Visual Studio配置libtorch visual Studio安装cuDNN安装CUDAToolkit安装libtorch下载Visual Studio配置libtorch(cuda版本配置) visual Studio安装 visual Studio点击安装 具体的安装和配置过程这里就不进行细讲了&#xff0c;可以参考我这篇博客Visual Studio配置OpenCV(保姆…...

【工具】一键生成动态歌词字幕

那眼神如此熟悉 让人着迷无力抗拒 一次又一次相遇 在眼前却遥不可及 命运总爱淘气 将一切都藏匿 曾有你的回忆 无痕迹 若不是心心相吸 又怎么会一步一步靠近 &#x1f3b5; 董真《思如雪》 下载LRC歌词 https://www.musicenc.com/article/50287.htmlhttp…...

Linux/Ubuntu/Debian从控制台启动程序隐藏终端窗口

如果你想从终端运行应用程序但隐藏终端窗口. 你可以这样做&#xff1a; 在后台运行&#xff1a; 你只需在命令末尾添加一个与号 (&) 即可在后台运行它。 例如&#xff1a; your_command &将 your_command 替换为你要运行的命令。 这将在后台启动该命令&#xff0c…...

Android中的设计模式---单例模式

1.什么是单例模式? 单例模式是一种创建型设计模式。它保证一个类只有一个实例,并且这个单例类提供一个函数接口让其他类获取到这个唯一的实例。 2.什么情况下会用到单例? ①频繁访问数据库或文件的对象; ②工具类对象; ③创建对象时耗时过多或耗费资源过多,但又经常用…...

【NLP笔记】文本分词、清洗和标准化

文章目录 文本分词中文分词英文分词代码示例 文本清洗和标准化 文本分词 参考文章&#xff1a;​一文看懂NLP里的分词&#xff08;中英文分词区别3 大难点3 种典型方法&#xff09;; 文本分词处理NLP的基础&#xff0c;先通过对文本内容进行分词、文本与处理&#xff08;无用标…...

2024 年系统架构设计师(全套资料)

2024年5月系统架构设计师最新第2版教材对应的全套视频教程、历年真题及解析、章节分类真题及解析、论文写作及范文、教材、讲义、模拟题、答题卡等资料 1、2023年11月最新第2版本教材对应全套教程视频&#xff0c;2022年、2021年、2020年、2018年、2016年五套基础知识精讲视频、…...

springboot蛋糕订购小程序的设计与实现

摘 要 相比于以前的传统手工管理方式&#xff0c;智能化的管理方式可以大幅降低商家的运营人员成本&#xff0c;实现了蛋糕订购的标准化、制度化、程序化的管理&#xff0c;有效地防止了蛋糕订购的随意管理&#xff0c;提高了信息的处理速度和精确度&#xff0c;能够及时、准确…...

MongoDB——linux中yum命令安装及配置

一、创建mongodb-org-3.4.repo文件 vi /etc/yum.repos.d/mongodb-org-3.4.repo 将下面内容添加到创建的文件中 [mongodb-org-3.4] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.4/x86_64/ gpgcheck1 enabled1 gpgkeyhttps://www…...

测试流程图显示

一、原理解析 / 概念介绍 1.1 自动化序列化流水线 hive_generator 处于开发链路的“后台”&#xff0c;负责将 Dart 对象转换为 Hive 识别的二进制流编码逻辑。 #mermaid-svg-bbx9YEu5DFSBhCuG{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;…...

HP 现在可以零成本构建原生 iOS 和 Android 应用 NativePHP for Mobile v3 发布

插件化架构 v3 版本最大的变化是引入了模块化插件系统。此前版本中集成在核心包里的原生功能&#xff0c;现在被拆分成独立的插件。 每个插件都是一个独立的 Composer 包&#xff0c;包含 Swift 和 Kotlin 代码、权限清单以及原生依赖。开发者只需安装实际用到的插件&#xf…...

气动元器件选型(工业自动化场景实战指南)

1. 气动技术基础与工业自动化适配性 气动技术作为工业自动化领域的核心驱动方式之一&#xff0c;其本质是通过压缩空气实现能量传递。想象一下&#xff0c;就像我们用吸管吹动纸团一样简单直接——空压机将电动机的旋转动能转化为气压能&#xff0c;再通过各类阀门控制气流方向…...

提升效率:用快马一键生成模块化openclaw控制代码库

最近在做一个机器人项目&#xff0c;需要控制openclaw机械爪完成各种抓取任务。刚开始自己从头写控制代码时&#xff0c;发现光是启动流程就要处理一堆底层细节&#xff0c;比如初始化通信、校准位置、设置默认参数等等&#xff0c;不仅重复劳动&#xff0c;还容易出错。后来尝…...

打破设备壁垒:VR-Reversal实现3D内容自由视角全设备适配

打破设备壁垒&#xff1a;VR-Reversal实现3D内容自由视角全设备适配 【免费下载链接】VR-reversal VR-Reversal - Player for conversion of 3D video to 2D with optional saving of head tracking data and rendering out of 2D copies. 项目地址: https://gitcode.com/gh_…...

【大数据】离线数仓核心组件:Hive 架构解析与进阶操作指南

Hive 是基于 Hadoop 的数据仓库工具&#xff0c;主要用于解决海量结构化日志的数据统计问题。它提供了一套类 SQL 的查询语言 HiveQL&#xff0c;通过将 SQL 语句转换为运行在 Hadoop 集群上的 MapReduce 或 Spark 任务&#xff0c;大幅降低了大数据分析的工程门槛。 目录 一、…...

IUV5G数字室分酒店项目实战:从勘察到验收的避坑指南

1. 站点勘察&#xff1a;这些细节不注意会让你返工 第一次做酒店5G室分项目时&#xff0c;我在勘察环节踩过不少坑。记得有次因为没注意电梯井的测量方式&#xff0c;导致后期设计方案全部推翻重做。下面这些实战经验&#xff0c;能帮你省去至少50%的返工时间。 经纬度记录有个…...

ABB机器人X6-WAN口多协议共存实战:NFS、Socket、RobotStudio与Profinet如何和谐共处?

ABB机器人X6-WAN口多协议共存实战&#xff1a;NFS、Socket、RobotStudio与Profinet如何和谐共处&#xff1f; 在工业自动化领域&#xff0c;ABB机器人系统的网络配置一直是工程师们关注的焦点。特别是当我们需要在单个X6-WAN口上同时运行NFS文件传输、Socket通信、RobotStudio远…...

第6章 数据类型转换-6.1 转换为整数

通过使用int()函数可以将仅含有数字的字符串或浮点数转换为十进制整数。其语法格式如下&#xff1a;int([x [, base]])其中&#xff0c;参数x为可选参数&#xff0c;表示仅含有数字的字符串或浮点数&#xff0c;如果省略该参数&#xff0c;则该函数返回0&#xff1b;参数base为…...

系统级音频均衡器如何提升macOS音质:开源eqMac完全指南

系统级音频均衡器如何提升macOS音质&#xff1a;开源eqMac完全指南 【免费下载链接】eqMac macOS System-wide Audio Equalizer & Volume Mixer &#x1f3a7; 项目地址: https://gitcode.com/gh_mirrors/eq/eqMac eqMac是一款开源的macOS系统级音频均衡器与音量混合…...