大话C语言:第43篇 结构体的位域

news2024/11/28 10:37:18

位域是结构体中的一个特殊成员,它允许我们指定该成员所占用的位数,而不是使用完整的字节或更大的单位。这在需要精确控制数据在内存中的布局时特别有用,例如在网络编程或硬件接口编程中。

位域的定义语法如下:

struct 标签或者结构体名
{  
    数据类型 成员1 : 位宽;  
    数据类型 成员2 : 位宽;  
    ...  
    数据类型 成员n : 位宽; 
};

例如,

struct Data
{
    unsigned int a:2;
    unsigned int b:6;
    unsigned int c:4;
    unsigned int d:4;
    unsigned int i;
};

结构体Data的内存模型:

代码示例:

#include <stdio.h>  
  
// 定义一个包含位域的结构体  
struct BitFields 
{  
    unsigned int flag1: 1;       // 占用1位  
    unsigned int count: 4;       // 占用4位  
    unsigned int flag2: 1;       // 占用1位  
    unsigned int : 2;            // 无名位域,用于填充,占用2位  
    unsigned int value: 8;       // 占用8位  
    unsigned int : 0;            // 用于强制对齐到下一个存储单元边界  
};  
  
int main() 
{  
    // 创建一个BitFields结构体的实例  
    struct BitFields bf;  
  
    // 设置位域的值  
    bf.flag1 = 1;           // 设置flag1为1  
    bf.count = 7;           // 设置count为7  
    bf.flag2 = 0;           // 设置flag2为0  
    bf.value = 255;         // 设置value为255(注意:这里可能会有截断,因为value只有8位)  
  
    // 打印位域的值  
    printf("flag1: %u\n", bf.flag1);  
    printf("count: %u\n", bf.count);  
    printf("flag2: %u\n", bf.flag2);  
    printf("value: %u\n", bf.value);  
  
    // 输出整个结构体的大小  
    printf("Size of struct BitFields: %lu\n", sizeof(struct BitFields));  
  
    return 0;  
}

注意,

  • 结构体中的位域字段在赋值时,不要超出位段定义的范围;例如,struct BitFields中的flag1只有一位,取值只能是0或者1。

  • 结构体中的位域字段的类型必须指定为整型或字符型。

  • 构体中的一个位域字段必须存放在一个存储单元中,不能跨两个单元。如果第一个单元空间不能容纳下一个位段,则该空间不用,而从下一个单元起存放该位段。

例如,

#include <stdio.h>  
  
// 定义一个包含位域的结构体  
struct BitFields 
{  
    char flag1: 7;       // 占用7位  
    char flag2: 7;       // 占用7位  
    char flag3: 5;       // 占用5位  
};  
  
int main() 
{  
    // 创建一个BitFields结构体的实例  
    struct BitFields bf;  
  
    // 设置位域的值  
    bf.flag1 = 1;           // 设置flag1为1  
    bf.flag2 = 7;           // 设置count为7  
    bf.flag3 = 0;           // 设置flag2为0   
  
    // 打印位域的值  
    printf("flag1: %u\n", bf.flag1);  
    printf("flag2: %u\n", bf.flag2);  
    printf("flag3: %u\n", bf.flag3);  
  
    // 输出整个结构体的大小  
    printf("Size of struct BitFields: %lu\n", sizeof(struct BitFields));  
  
    return 0;  
}

注意,位域长度不能超过数据类型存储单元的长度。其中,

  • char型位段不能大于8位

  • short int型位段不能大于16位

  • int的位段,位段不能大于32位

  • long int的位段,位段不能大于32位

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用TeamCity实现maven项目的CI/CD

1.什么是TeamCity&#xff1f; TeamCity 是一款由 JetBrains 开发的强大的持续集成&#xff08;Continuous Integration&#xff0c;CI&#xff09;和持续部署&#xff08;Continuous Deployment&#xff0c;CD&#xff09;工具。它帮助开发团队自动化构建、测试和部署过程&am…

Spring Boot OAuth2.0应用

本文展示Spring Boot中&#xff0c;新版本OAuth2.0的简单实现&#xff0c;版本信息&#xff1a; spring-boot 2.7.10 spring-security-oauth2-authorization-server 0.4.0 spring-security-oauth2-client 5.7.7 spring-boot-starter-oauth2-resource-server 2.7.10展示三个服务…

汽车服务管理系统 _od8kr

TOC springboot580汽车服务管理系统 _od8kr--论文 系统概述 该系统由个人管理员和员工管理&#xff0c;用户三部分组成。其中&#xff1a;用户进入系统首页可以实现首页&#xff0c;热销汽车&#xff0c;汽车配件&#xff0c;汽车资讯&#xff0c;后台管理&#xff0c;在线客…

TCP端口范围

ip_local_port_range sysctl -a | grep ip_local_port_range | head 默认情况下&#xff0c;net.ipv4.ip_local_port_range的默认值为32768-60999。这意味着本地应用程序可以使用的端口号范围为32768到60999。 sysctl -a | grep net.ipv4.ip_local_reserved_ports |head …

光伏检测气象站:实时监测:高效管理

随着全球对可再生能源需求的日益增长&#xff0c;光伏发电作为清洁能源的重要组成部分&#xff0c;其重要性日益凸显。然而&#xff0c;光伏发电的效率与稳定性受气象条件影响显著&#xff0c;如光照强度、温度、湿度、风速等因素均能直接影响光伏板的发电效率。因此&#xff0…

宠物空气净化器是智商税吗?希喂、范罗士热门产品真实性能测试

宠物空气净化器作为宠物领域的新产品&#xff0c;凭借自身独特的功能受到铲屎官们的喜爱&#xff0c;越来越多的商家关注到这个市场。然而&#xff0c;市面上品牌逐渐增多&#xff0c;质量却参差不齐&#xff0c;一些不良商家以次充好&#xff0c;容易让消费者陷入消费陷阱。 …

Codeforces Round 961 D. Cases 【SOS DP、思维】

D. Cases 题意 有一个长度为 n n n 且仅由前 c c c 个大写字母组成的字符串&#xff0c;问最少选取多少种字母为每个单词的结尾&#xff0c;使得每个单词长度不超过 k k k 思路 首先注意到最后一个字母一定要选择&#xff0c;接下来我们给出一个断言&#xff1a;如果一个…

Fx - day3 - 沙盒/更改集/互联更改集/配置包

Fxiaoke - day3 - 沙盒/更改集/互联更改集/配置包 学习目标&#xff1a;熟悉 沙盒&#xff0c;更改集&#xff0c;配置包&#xff0c;互联更改集 的概念以及使用场景 0、前言 沙盒理解 很多时候我们可能需要一个沙盒环境&#xff0c;什么是沙盒环境&#xff1f; 沙盒环境&…

如何打造Java SpringBoot私房菜定制上门服务系统,实现个性化餐饮体验?

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

惠海H4312 dcdc同步整流降压恒压IC 30V 40V转3.3V/5V/12V小体积大电流单片机供电

1.产品描述 H4312是一种内置30V耐压MOS&#xff0c;并且能够实现精确恒压以及恒流的同步降压型 DC-DC 转换器: 支持 3.1A 持续输出电流输出电压可调&#xff0c;最大可支持 100%占空比;通过调节FB 端口的分压电阻&#xff0c;可以输出2.5V到 24V的稳定电压。 H4312 采用高端…

【脏数据 bug 解决】ValueError: mean must have 1 elements if it is an iterable, got 3

问题描述&#xff1a; 在训练模型的过程中&#xff0c;出现 clip_image_processor 无法处理数据的问题&#xff0c;说明数据集中很可能出现了脏数据。本文使用的数据为 LAION-Aesthetics-V2-6.5plus&#xff0c;从 https://dagshub.com/DagsHub-Datasets/LAION-Aesthetics-V2-…

21、springboot3 vue3开发平台-前端-自定义树形穿梭框,用于角色权限分配

文章目录 1. 使用原因2. 实现3. 使用 1. 使用原因 elemenutplus 有穿梭框&#xff0c;但是不支持树状数据的操作&#xff0c;所以这里自定义树状穿梭框&#xff0c;用于菜单权限分配&#xff0c; 如下&#xff1a; 2. 实现 这里主要是将菜单列表树解构后添加修改组合再恢复…

STM32H7双路CAN踩坑记录

STM32H7双路CAN踩坑记录 目录 STM32H7双路CAN踩坑记录1 问题描述2 原因分析3 解决办法4 CAN配置参考代码 1 问题描述 STM32的CAN1和CAN2无法同时使用。 注&#xff1a;MCU使用的是STM32H743&#xff0c;其他型号不确定是否一样&#xff0c;本文只以STM32H743举例说明。 2 原因…

odoo17 网站内容存在哪了

odoo17 网站内容存在哪了 查数据库内容&#xff0c;却没找到 没理解这些内容到底存在了哪里呢

图文详解ThreadLocal:原理、结构与内存泄漏解析

目录 一.什么是ThreadLocal 二.ThreadLocal的内部结构 三.ThreadLocal带来的内存泄露问题 ▐ key强引用 ▐ key弱引用 总结 一.什么是ThreadLocal 在Java中&#xff0c;ThreadLocal 类提供了一种方式&#xff0c;使得每个线程可以独立地持有自己的变量副本&#xff0c;而…

「黑神话:悟空」狂销 15 亿!高清游戏录制神器助你称霸

短短一天时间 《黑神话&#xff1a;悟空》在Steam上已售出超过300万份 加上wegame、epic和ps平台 目前总销量超过450万份&#xff0c;总销售额超过15亿元。 根据Steam平台实时数据 8月20日晚间20点30分 该平台《黑神话&#xff1a;悟空》同时在线玩家人数突破200万 达到2…

手机怎么把百度网盘里的文件打印出来?

在日常生活中&#xff0c;我们常常需要打印各种文档&#xff0c;比如合同、报告或是学习资料。有时这些文件存储在网盘中&#xff0c;比如百度网盘&#xff0c;这时候如果能够直接从网盘中打印出来&#xff0c;将会极大地提高效率。今天&#xff0c;就让我们来了解一下如何使用…

PL3366C 用0.1+的芯片做过认证5V1A电源

PL3366C是一款原边反激式5W开关电源芯片恒流/恒压电源。PL3366C高度集成了功率开关&#xff0c;无需光耦以及次级控制电路&#xff0c;PL3366C的复合模式的应用使芯片能够实现低静态功耗、低音频噪音、高效率。满载时PL3366C工作在PFM模式&#xff0c;随着负载降低&#xff0c;…

I2C学习:上拉电阻选取

一&#xff0e;I2C简介 I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。I2C总线在使用时&#xff0c;需要接上拉电阻&#xff0c;这是因为I2C接口是开漏输出&#xff0c;如图1所示。 图1 I2C开漏输出 I2C有5种速度模式&#xff1a;标准&#xff08;100KHz&am…

日志文件的理解

前言 说实在话我一直对于日志不太理解&#xff0c;感觉这词说的这么高大上&#xff0c;不好理解&#xff0c;甚至还有点畏惧这个东西&#xff0c;所以专门去研究了下&#xff0c;最后发现这家伙不就是输出信息嘛&#xff0c;就像C语言中printf输出的信息&#xff0c;C中cout输…