c语言位域详解
一、什么是位域
位域是一种可以让结构体的成员变量以位为单位进行存储和操作的特性。位域允许我们精确控制数据的存储方式,而不像普通的整型变量那样固定使用系统规定的字节大小。
通过位域,我们可以在一个整型数据中指定具体的位数来表示某些信息。比如,如果我们只需要一个变量的某些位来表示状态,我们可以用位域来减少存储空间。
二、位域的语法
位域通常用于结构体中,定义方式如下:
struct bits {类型 成员名 : 位数;
};
类型:可以是int、unsigned int、signed int,bool等整型数据类型或者布尔数据类型(有一些编辑器也有其他的实现)。unsigned int,对于无符号位域( unsigned int b:3; 拥有范围 0~7 )signed int,对于有符号位域( signed int b:3; 拥有范围 -4~3 )int,对于拥有实现定义符号性的位域,注意,这里的int与signed int不是一个意思(int b:3; 可能拥有 0~7 或 -4~3 范围的值),在一些资料中也可以看到int可以是普通成员,位域与普通成员混合,int作为普通成员会被放在下一个字段进行对齐操作。bool,对于单个位的位域( bool x:1; 拥有范围 0…1 ),从它和到它的隐式转换遵循布尔转换规则
成员名:结构体的成员名。位数:定义成员所占用的比特位数,通常是0到类型所能提供的最大位数。
三、位域的例子
以下是一个简单的位域例子:
#include <stdio.h>struct {unsigned int a : 1; // 1位,用于存储0或1unsigned int b : 3; // 3位,可表示0-7之间的数unsigned int c : 4; // 4位,可表示0-15之间的数unsigned int :4; // 只占位,无任何作用。
} bitfield;int main() {bitfield.a = 1;bitfield.b = 5;bitfield.c = 10;printf("a = %d, b = %d, c = %d\n", bitfield.a, bitfield.b, bitfield.c);// 输入 a = 1, b = 5, c = 10return 0;
}
在这个例子中:
a占1位,可以存储0或1。b占3位,可以存储从0到7的数。c占4位,可以存储从0到15的数。
四、位域的使用场景
-
硬件寄存器编程
在与硬件打交道时,寄存器往往是按位操作的。通过位域,我们可以轻松地定义和操作寄存器中的各个位。struct {unsigned int power_on : 1;unsigned int ready : 1;unsigned int error : 1;unsigned int reserved : 5; } status_register;这个结构体定义了一个8位的寄存器,其中前三个位分别表示电源状态、准备状态和错误状态,剩下的5位保留。
-
存储优化
在存储资源紧张的嵌入式设备上,位域可以有效减少存储空间。例如,一个标志变量可以用1个位而不是整个字节。
五、位域的底层存储
位域的具体存储方式与平台和编译器密切相关,以下几点需要注意:
- 存储顺序:位域的存储顺序(从高位到低位或从低位到高位)是由编译器实现决定的,因此跨平台时应注意位域在不同平台上的行为差异。
- 内存对齐:在某些平台上,位域成员可能需要按字节、字或双字对齐。这取决于编译器的对齐策略。
- 最大位数:位域的最大位数不能超过其基础类型所能表示的最大位数。例如,如果位域类型是
unsigned int,那么最大位数不能超过32位(在大多数系统上)。
六、位域的局限性
- 不可取地址:由于位域不是标准的变量,无法获取它们的地址。因此,不能对位域成员使用
&运算符。 - 跨平台问题:位域的具体实现和存储方式依赖于编译器,因此在跨平台开发时可能会遇到位域行为不同的问题。
- 性能问题:在某些情况下,使用位域可能会导致比直接使用整型变量更低的性能,特别是在需要频繁操作位域时,编译器可能会生成额外的代码来处理这些操作。
七、总结
位域操作看上去很好,但是其实处处受限,其跨平台性很差,使用时应该谨慎
相关文章:
c语言位域详解
一、什么是位域 位域是一种可以让结构体的成员变量以位为单位进行存储和操作的特性。位域允许我们精确控制数据的存储方式,而不像普通的整型变量那样固定使用系统规定的字节大小。 通过位域,我们可以在一个整型数据中指定具体的位数来表示某些信息。比…...
如何修改Spring Boot内置容器默认端口
默认情况下,Spring Boot 应用程序在嵌入式 Tomcat 服务器上启动,并监听默认端口 8080。如果您需要将默认的嵌入式服务器端口更改为其他端口号,可以使用以下几种方法之一: 嵌入式服务器配置命令行参数属性文件 在代码里以编程方式…...
STM32自动下载电路分享及注意事项
文章目录 简介ISP下载启动配置 USB转串口芯片CH340C手动isp下载自动isp下载RTS、DTR电平变化分析注意事项 简介 在嵌入式开发中,使用STM32下载程序,可以通过仿真器下载,也可以通过串口下载。在stm32串口下载时,我们需要手动配置启…...
【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。
【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。 【深度学习基础模型】极限学习机(Extreme Learning Machines, ELM)详细理解并附实现代码。 文章目录 【深度学习基础模型】极限学习机&a…...
把交换机的两个接口连接起来会怎么样?
当把交换机的两个接口连接起来时,可能会产生网络风暴,具体情况如下: 一、形成环路的过程 如果将交换机的两个端口直接连接,就会在网络中形成一个物理环路。例如,假设交换机有端口 A 和端口 B,用一根网线将…...
无人机陆空双模式。
🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&am…...
14. 文档对象模型
打开网页时,浏览器会检索网页的 HTML 文本并对其进行解析,就像第 12 章中的解析器解析程序一样。浏览器会建立一个文档结构模型,并使用该模型在屏幕上绘制页面。这种文档表示法是 JavaScript 程序在沙盒中的玩具之一。它是一种可以读取或修改…...
【计网】【计网】从零开始学习http协议 ---理解http重定向和请求方法
去光荣地受伤, 去勇敢地痊愈自己。 --- 简嫃 《水问》--- 从零开始学习http协议 1 知识回顾2 认识网络重定向3 http请求方法3.1 http常见请求方法3.2 postman工具进行请求3.3 处理GET和POST参数 1 知识回顾 前面两篇文章中我们学习并实现了http协议下的请求与应…...
yolov8/9/10/11模型在中医舌苔分类识别中的应用【代码+数据集+python环境+GUI系统】
yolov8、9、10、11模型在中医舌苔分类识别中的应用【代码数据集python环境GUI系统】 背景意义 目前随着人们生活水平的不断提高,对于中医主张的理念越来越认可,对中医的需求也越来越多。 传统中医的舌诊主要依赖于医生的肉眼观察,仅仅通过这…...
k8s部署安装
k8s部署安装 一 K8s集群环境搭建1.1 k8s中容器的管理方式1.2 k8s集群部署1.2.1 k8s环境部署说明1.2.2 k8s集群环境初始化1.2.2.1 所有节点禁用swap和本地解析1.2.2.2 所有节点安装docker1.2.2.3.所有节点设定docker的资源管理模式为systemd1.2.2.4.所有阶段复制harbor仓库中的证…...
gpt为什么可以依据上下文来回答问题,依据的是什么原理
GPT 可以依据上下文回答问题,主要依据以下几个原理: Transformer 架构: 并行计算与长距离依赖处理:Transformer 架构摒弃了传统的递归神经网络和长短时记忆网络的序列依赖处理方式,具有并行计算的能力。它可以同时处理…...
2023 CCPC哈尔滨 报告
比赛链接:Dashboard - 10.6组队训练赛-2023CCPC哈尔滨站 - Codeforceshttps://codeforces.com/group/w6iGs8kreW/contest/552949 做题数:3 题 三题都是队友写的。所以来补一下 B L J。 B题: B. Memory Little G used to be a participant …...
基于深度学习的手术中的增强现实导航
基于深度学习的手术中的增强现实(AR)导航技术是一种结合了先进的计算机视觉算法、深度学习模型与增强现实技术的创新应用。其主要目的是为外科手术提供实时的、精确的手术指导,帮助医生在复杂的手术过程中更好地理解患者的解剖结构࿰…...
输电线路缺陷图像检测数据集,导线散股,塔材锈蚀两类,分别为581张和1407张,标注为xml和txt格式 1988张
输电线路缺陷图像检测数据集,分为导线散股,塔材锈蚀两类,分别为581张和1407张,标注为xml和txt格式 数据集名称 输电线路缺陷图像检测数据集 (Transmission Line Defect Detection Dataset) 数据集概述 该数据集是一个专门用于训…...
百度飞桨(paddlepaddle)安装
百度飞桨(paddlepaddle)安装 Anaconda升级 打开 Anaconda Prompt (或者 Mac 下的终端),键入: conda upgrade --all pip 安装 python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/s…...
≌图概念凸显有长度不同的射线
黄小宁 【摘要】自有射线概念后的2300年里一直无人能知有长度不同的射线、无人能知有互不≌的射线,从而使数学一直有几何“常识”:任何射线都没有长度差别。保距变换和≌图概念使人能一下子看到有长度不同的射线。 变量x所取各数也均由x代表,…...
解决Nginx出现“Too many open files”的问题
解决Nginx出现“Too many open files”的问题 在那个不经意的瞬间,我感到一阵莫名的恍惚。同事突然提出要看我的手机,她的目光落在了我那泛黄的手机壳上。出乎意料地,她开始细心地擦拭,从内到外,动作轻柔而专注。那一刻…...
webGL进阶(一)多重纹理效果
效果: 代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&q…...
flink-jdbc-driver
Flink JDBC 驱动程序是一个 Java 库,使客户端能够通过 SQL 网关将 Flink SQL 发送到 Flink 集群。 首先启动:1.flink集群,随意任何集群。 2.启动flink-sql-gateway: sql-gateway.sh start -Dsql-gateway.endpoint.rest.addresslo…...
快速的配置Prettier,让代码更整洁
快速的配置Prettier,让代码更整洁 一个人一个代码风格,先抛开语法的使用不谈,加不加空格、加不加分号也是萝卜白菜各有所爱,那怎么统一我们的代码格式呢 prettier 就是为我们解决这个问题的 1. 如何制定我们的代码风格 我们可以在…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
