解码C语言位字段
一、位字段的定义
位字段允许在结构体中按 位(bit) 为单位分配成员空间,用于紧凑存储布尔标志或小范围整数值,节省内存。常用于硬件寄存器操作、协议数据解析等场景。
二、位字段的语法
1. 基本声明
struct 结构体名 {
类型 成员名 : 位宽;
};
- 类型:必须为整型(
int、unsigned int、signed 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 0010
p = (struct S *)#
/*
0 0 0 1 0 0 1 0
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
*/
}
解码C语言位字段的更多相关文章
- (C)位字段(bit-field)
位字段(bit-field) 在存储空间很宝贵的情况下,有可能需要将多个对象保存在一个机器字中,一种常用的方法是:使用类似于编译器符号表的单个二进制位标志集合,外部强加的数据格式(如设备接口等寄存器) ...
- C语言位运算符:与、或、异或、取反,左移和右移
C语言位运算符:与.或.异或.取反.左移和右移 个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. ,则该位的结果值为1,否则为0 | ...
- C语言位运算
C语言位运算详解 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,shor ...
- C语言位运算符:与、或、异或、取反、左移和右移
语言位运算符:与.或.异或.取反.左移和右移 位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符 ...
- 2013年6月编程语言排行榜,C语言位据第一位
2013年6月编程语言排行榜,C语言位据第一位 C语言是很多主流开发语言的母体,.NET的底层,Java的底层都是C开发的,虽然很多新语言来势汹汹,但究其根源,都脱离不开C语言
- C语言位运算+实例讲解(转)
按位或 按位与 按位异或 按位取反 左移右移 C语言位运算 有6种: &, | , ^(亦或), >(右移). 注意:参与位运算的元素必须是int型或者char型,以补码形式出现. 按位 ...
- union, enum, and struct, 以及结构填充和位字段实现。
Table 4-9 Compiler storage of data objects by byte alignment Type Bytes Alignment char, bool, _Bool ...
- 20140321 sizeof 虚函数与虚函数表 静态数组空间 动态数组空间 位字段
1.静态的数组空间char a[10];sizeof 不能用于1:函数类型 2:动态的数组空间new3:位字段 函数类型:int fun();sizeof(fun())计算的是返回类型的大小,并不是函 ...
- C语言位运算详解[转]
作者:911 说明:本文参考了http://www2.tsu.edu.cn/www/cjc/online/cyuyan/,算是对其的修正,在此将本文列为原创,实有抄袭之嫌疑.甚是惭愧! 位运算是指按二 ...
- C语言位运算详解
位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整形操作数,即只能用于带符号或无符号的char.short.int与long类型 ...
随机推荐
- Java MCP 鉴权设计与实现指南
一.MCP 鉴权概述 MCP (Model Context Protocol) 旨在为大语言模型(LLM)与外部数据源.工具和服务提供标准化.安全的集成方式(相当于一种专用的 RPC 协议).广泛应用 ...
- 保姆级vmware安装MacOS
为啥是v10.15 MacOS10.15对硬件的要求很低,一般是不会卡的 准备工作 开始之前,请先完成以下步骤: 你的计算机中装有VMware Workstation 15及以上版本, 并确定你的磁盘 ...
- Luogu P11160 【MX-X6-T6】機械生命体 题解
P11160 [MX-X6-T6]機械生命体 注意到 \(\text{lowbit}\) 是从最低位开始的,所以我们把数字按照二进制位从低位往高位插进字典树. 插入和删除操作是平凡的.查最大 \(\t ...
- GAMES101 作业0 图形学
简介 作业用来校验自己做的是否正确.请不用copy,因为这是cheat youself. 题目 给定一个点 P=(2,1), 将该点绕原点先逆时针旋转 45◦,再平移 (1,2), 计算出变换后点的坐 ...
- SciTech-Mathmatics-Probability+Statistics-IV-Population:Parameter<->Sample:Statistics : Confidence Interval(置信区间)
SciTech-Mathmatics-Probability+Statistics-IV- Population:Parameter<->Sample:Statistics : CI(Co ...
- Win10正式版出现电脑时间不同步的问题
有一位电脑基地的小伙伴,使用win10正式版系统之后发现电脑上的时间不同步,跟手机的时间不一样.对于很多在工作时需要准确时间的用户来说这是一件很麻烦的事情.那么这个问题要如何解决呢?接下来,深度技术系 ...
- idea 设置编译方式为maven编译, 并且在编译Java源文件时debug(annotation processor)
目录 idea 设置编译方式为maven编译 编译时debug(annotation processor) idea 设置编译方式为maven编译 Settings -> "Ctrl+ ...
- linux - ip route 操作主机路由
在Linux中,我们经常会涉及到修改主机的路由列表,以前都是使用route这个命令,但是在CentOS7中默认已经不安装net-tools这个包,所以默认是没有route这个命令的,可以使用ip ro ...
- 【数据结构】7.平衡搜索树(AVL树和红黑树)
0. 概述 对于普通的搜索树,如果一直插入比第一个元素小的元素,它会退化成一个无限向左下角眼神的单链表,使得时间复杂度退化为O(n).如果我们在插入时保持树的结构是平衡的,则可以保证查找.插入和删除的 ...
- 珂朵莉树(老司机树,ODT,颜色段均摊)
前言 在宿舍里有人说珂朵莉树写起来比shi山线段树方便多了. 正文 珂朵莉树,又名老司机树,颜色段均摊,ODT. 可以在数据完全随机化的情况下较快的完成一些操作(所以容易被卡). 珂朵莉树其实形态并不 ...