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

解码C语言位字段

一、位字段的定义

位字段允许在结构体中按 位(bit) 为单位分配成员空间,用于紧凑存储布尔标志或小范围整数值,节省内存。常用于硬件寄存器操作、协议数据解析等场景。

二、位字段的语法

1. 基本声明

struct 结构体名 {类型 成员名 : 位宽;
};
  • 类型:必须为整型(intunsigned intsigned int)或兼容类型(如 _Bool)。
  • 位宽:指定成员占用的位数(1~32,取决于类型长度)。

2. 示例

// 定义一个状态寄存器的位字段
struct StatusRegister {unsigned int error_flag : 1;// 1位:错误标志(0/1)unsigned int mode : 3;// 3位:模式(0~7)unsigned int reserved : 4;// 4位:保留位unsigned int value : 8;// 8位:数值(0~255)
};

三、位字段的内存布局

1. 存储单元分配

  • 编译器将位字段按 存储单元(Storage Unit) 分组,通常为 int 大小(32位或64位)。
  • 当多个位字段总位数不超过存储单元时,连续存放;否则开启新存储单元。

2. 内存对齐示例

struct Example {unsigned int a : 4;// 占用4位unsigned int b : 5;// 再占5位(同一存储单元)unsigned int c : 20;// 总位数超过32,开启新存储单元
};
// 总大小:4 + 5 + 20 = 29位 → 需要2个int(32位系统下占8字节)

小端存储:低位数据保存到低地址空间

struct S {unsigned char bit0 : 1;unsigned char bit1 : 1;unsigned char bit2 : 1;unsigned char bit3 : 1;unsigned char bit4 : 1;unsigned char bit5 : 1;unsigned char bit6 : 1;unsigned char bit7 : 1;//bit不能进行取地址操作
};
int main()
{struct S *p = NULL;unsigned char num = 0x12; //0001 0010p = (struct S *)#/*0      0      0      1      0      0      1      0bit7   bit6   bit5   bit4   bit3   bit2   bit1   bit0*/ 
}
http://www.gsyq.cn/news/8455.html

相关文章:

  • Sql Server 多层嵌套事务的执行结果
  • es入门
  • 02-Media-7-uvc.py 应用软件解码的USB摄像头(UVC)捕获视频并显示的程序
  • YOLO入门理解 评估指标
  • [ICPC 2024 Yokohama R] Peculiar Protocol
  • The 2025 ICPC Asia East Continent Online Contest (II)(C,D,E,H,I)
  • 实用指南:微信小程序-6-页面布局和事件绑定以及页面跳转
  • 终旅之始——2025 . 9 . 20
  • 深入理解Django Admin只读字段与保存模型的自定义操作 - 详解
  • 深度学习(视觉注意力SeNet/CbmaNet/SkNet/EcaNet)
  • qoj6277 Linear Congruential Generator
  • Node.js、npm 和 npx:前端开发的三剑客 - 指南
  • docker+k8s
  • JBoltAI多模态赋能:制造业数智化升级的新引擎
  • 直播软件开发,单例设计模式很简单吗? - 云豹科技
  • JBoltAI:赋能Java老项目快速接入AI能力的创新之道
  • Java开发生态的数智化升级:JBoltAI如何重塑企业AI应用架构
  • 【深度学习计算机视觉】05:多尺度目标检测 - 实践
  • 初步研究vivio的互传的备份数据格式
  • 完整教程:C#.NetCore NPOI 导出excel 单元格内容换行
  • 直播软件怎么开发,自适应两栏布局方式 - 云豹科技
  • 基于SpringBoot的足球论坛系统+论文示例参考 - 指南
  • go: 生成缩略图
  • git: 报错: fatal: 协议错误:错误的行长度字符串:This 或 fatal: protocol error: bad line length character: This
  • gin: 打包模板文件、静态文件到二进制文件中
  • gin: 判断是否ajax请求
  • An Empirical Study on Commit Message Generation using LLMs via In-Context Learning 论文笔记
  • Jetpack Navigation - 在 Fragment 中跳转到 Activity(4 种方式) - 详解
  • 强化学习之父 Richard Sutton: 如今AI正进入“经验时代” - 指南
  • 嵌入式笔记系列——UART:TTL-UART、RS-232、RS-422、RS-485 - 指南