【C语言】位段(详解)

news/2025/2/27 17:33:23/

目录

  • 1. 什么是位段
  • 2. 位段的内存分配

1. 什么是位段

结构体中可以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或“位域”( bit field) 。利用位段能够用较少的位数存储数据。

位段的好处:

  • 位段可以使数据单元节省储存空间
  • 位段可以很方便的访问一个整数值的部分内容从而可以简化程序源代码

此外

  • 位段是定义在结构体中的
  • 位段成员数据类型可以是 int, unsigned int, signed int, char, unsigned char, signed char 类型
  • 位段空间是按需以4个(int型)或1个(char型)字节来开辟的
  • 位段不可跨平台,所以可移植的程序应避免使用位段
struct A
{int _a : 2;int _b : 3;char c : 1;char d : 4;
};

2. 位段的内存分配

对于下面这个结构体中的位段

struct S
{char a : 3;char b : 4;char c : 5;char d : 4;
};

内存分配图如下(VS环境)
在这里插入图片描述
 
 
注意:

  • 这里位段类型为char,所以当比特位不够时每次补充一个字节的空间
  • 位段存在跨平台的问题,当一个位段成员存储后的空余空间无法完整容纳下一个位段成员时,是将空余内存空间舍弃还是利用,是不确定的
  • 并且位段成员的内存是从左向右还是从右向左分配也是不确定的

与结构体将比,位段能够更大限度的节约内存空间,但是存在跨平台问题, 需谨慎使用。

 

练习:

unsigned char puc[4];struct tagPIM{unsigned char n;unsigned char a : 1;unsigned char b : 2;unsigned char c : 3;}*pstPimData;pstPimData = (struct tagPIM*)puc;memset(puc,0,4);pstPimData->n = 2; pstPimData->a = 3;pstPimData->b = 4;pstPimData->c = 5;printf("%02x %02x %02x %02x\n",puc[0], puc[1], puc[2], puc[3]);

vs环境下其内存分布分析
在这里插入图片描述
即打印结果为 02 29 00 00
 


http://www.ppmy.cn/news/33372.html

相关文章

Spring Profiles and @Profile

1. Overview In this tutorial, we’ll focus on introducing Profiles in Spring. Profiles are a core feature of the framework — allowing us to map our beans to different profiles — for example, dev, test, and prod. We can then activate different profiles…

Keil5安装和使用小记

随着keil版本的更新,一些使用问题一随之产生。本文针对安装目前最新版本keil软件和使用问题做一些总结。 目录1 Keil5下载&安装1.1 官网下载链接1.2 软件安装1.2.1 安装说明1.2.2 关于 51 和 ARM 共存的问题1.3 软件破解2 pack包安装 & 破解2.1 下载2.2 安装…

Go语言必知必会100问题-02 减少代码的嵌套层数

减少代码的嵌套层数 软件开发中的“心智模型”用于描述开发人员在编码时心理活动,每段代码其实是人在编写这段代码时的心智模型投射,不能把代码看成是客观的存在,而是主观的产物,参合了当时心理活动或各种直觉感知。在编程时&…

特征建模之FiBiNet

FiBiNet: Combine Feature importance and Bilinear feature Interaction for Click-Through Rate Prediction https://arxiv.org/abs/1905.0943 一、特征建模的重要性 推荐领域的深度CTR模型中的参数主要由两部分构成:特征Embedding参数和MLP层参数,假…

【基于协同过滤算法的推荐系统项目实战-2】了解协同过滤推荐系统

本文目录1、推荐系统的关键元素1.1 数据1.2 算法1.3 业务领域1.4 展示信息2、推荐算法的主要分类2.1 基于关联规则的推荐算法基于Apriori的算法基于FP-Growth的算法2.2 基于内容的推荐算法2.3 基于协同过滤的推荐算法3、推荐系统常见的问题1、冷启动2、数据稀疏3、不断变化的用…

Spark SQL函数定义【博学谷学习记录】

1 如何使用窗口函数窗口函数格式:分析函数 over(partition by xxx order by xxx [asc|desc] [rows between xxx and xxx])学习的相关分析函数有那些? 第一类: row_number() rank() dense_rank() ntile()第二类: 和聚合函数组合使用 sum() avg() max() min() count()第三类: la…

博客系统实现自动化测试

目录 一、设计博客系统的测试用例 二、利用测试用例进行测试 测试登录页面 界面测试 功能测试 测试博客列表页 界面测试 功能测试 测试博客详情页 界面测试 功能测试 博客编辑页测试 界面测试 功能测试 一、设计博客系统的测试用例 二、利用测试用例进行测…

微信小程序项目实例——扫雷

今日推荐💁‍♂️ 2023许嵩演唱会即将到来🎤🎤🎤大家一起冲冲冲🏃‍♂️🏃‍♂️🏃‍♂️ 🔮🔮🔮🔮🔮往期优质项目实例&#x1f52e…