也谈C/C++中的位域

C/C++ 位域定义 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位... 阅读详情

C/C++中的位域在百度百科里面介绍了一些基础知识,但遗憾的是没有和内存示意相结合,初学者容易理解偏差。
以下内容是假设读者已初步理解掌握了百度百科“位域”的基础上,再加以补充说明:《Soloe@csdn,转载请说明》
1、位域中的变量字段,最小占用是其变量说明的类型在“正常占用”下的大小。
什么意思呢,看下面这个例子:

struct A
{
    int a:5;
    int b:3;
};

这里a和b总共占用了8bit,那么这个结构体的大小是否为1字节?
答案是no,笔者电脑上 sizeof(A) 结果为4,这是因为在x86下int占4个字节。

2、继续前面的案例,a和b在这四个字节中处于哪个位置?
高位 低位

高位低位
00000100000000110000000100000000
bbbaaaaaa

答案如上图所示,a占了最低位的5个bit,b占了a左边的3个比特

3、从结构体位域转换成正常变量,需要注意哪些事项:
看下面的例子:

#include <iostream>
#include <memory.h>
using namespace std;
struct A
{
    int a:5;
    int b:3;
};
int main(void)
{
    char str[100] = "0134324324afsadfsdlfjlsdjfl";
    struct A d;
    memcpy(&d, str, sizeof(A));
    cout << d.a << endl;
    cout << d.b << endl;
    return 0;
}

输出是多少?
答案是:

-16
1

原因是int a和int b是有符号数,要注意符号位的扩展。

高位低位
00000100000000110000000100000000
‘4’‘3’‘2’‘1’

其中d.a和d.b占用d低位一个字节(00110000),d.a : 10000, d.b : 001
d.a内存中二进制表示为10000,由于d.a为有符号的整型变量,输出时要对符号位进行扩展,所以结果为-16(二进制为11111111111111111111111111110000)

d.b内存中二进制表示为001,由于d.b为有符号的整型变量,输出时要对符号位进行扩展,所以结果为1(二进制为00000000000000000000000000000001)

《Soloe@csdn,转载请说明》
最后给出一个面试的案例:

struct mybitfields
{
    unsigned short a : 4;
    unsigned short b : 5;
    unsigned short c : 7;
} test
void main(void)
{
    int i;
    test.a=2;
    test.b=3;
    test.c=0;
    i=*((short *)&test);
    printf("%d\n",i);
}

聪明的你,能直接在评论中给出答案吗?

C/C++ 中的位域 各种基本数据类型中,长度最小的char和bool在内存中占用一个字节的空间,但对于某些数据类型只需要几个二进制位即可保存,例如: enum GameResult { WIN, LOSE, TIE, CANCEL }; 由于它只有四种取值,只需要两个二进制位就可保存,而一个GameResult类型变量至少要占1个字节(8个二进制位),在很多编译器中,甚至还会占据更多的空间。单一变量所浪费的空间也许并... 阅读详情

相关推荐

C/C++位域概念及位域并发修改问题

在计算机中,数据是以0和1两种形态进行表述的,而每个0和1都占据了一个位(bit)的大小,8个位(bit)可以组成一个字节(byte),一个字节就是计算机里数据类型的最小基本单位,如:char在32bit系统中大小为一个字节(byte)。但我们应该知道,虽然字节是最小的数据类型基本单位,但有时候我们或许是用不完这一个字节的,如:我们要表示一个开关量的时候,它就两种情况:0和1嘛,若我们申请了一个字

oYinGui1 2150

c++中位域简介

位域列表中各个元素的描述: tpye: 类型只能是int(整型),unsigned int(无符号整型),signed int(有符号整型) [name]: 位域的名字,遵循变量的命名规则,[]方括号是可选的,如果没有名字,那么代表空域,该位域是不可用的,类似于占位 width: 位域占这种类型的多少个位,width 的大小应该小于等于type类型所占内存大小,比如int 32位, width 必须小于等于32

南城小馆 476

基于STM32环境温湿度监测系统设计

基于STM32环境温湿度监测系统设计1. 实验目的2. 任务和要求3. proteus仿真图4. 实验代码 1. 实验目的 (1) 掌握使用 KEIL MDK5 进行软件开发的具体流程; (2) 掌握硬件电路的设计方法; (3) 掌握 STM32 微控制器的程序设计及代码编写方法。 2. 任务和要求 (1)在 STM32F103 平台下,通过温度传感器 DS18B20 和湿度传感器 DHT11 实现环境温湿度信息的采集; (2)将温度传感器和湿度传感器所采集的数据在 LCD 液晶屏幕上显示出来,超

唯一的博客 2万+

C/C++位域详解整理

位域 一、定义: 有些信息在存储时,并不需要占用一个完整的字节,而只需要占一个或几个二进制位。例如在存放一个开关量时,只有0和1两种状态,只需要用一位二进制位即可。为了节省存储空间,并且为了让处理变得更便捷,C语言又提供了一种数据结构,称为“位域”或者“位段”。所谓位域,就是把一个字节中的二进制位划分为不同的区域,并说明每个区域的位数。每个域都有一个域名,允许程序中按照域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。 二、结构: 位域的结构与结构体相似 struct <位域结构名

m0_46526726的博客 1万+

Elasticsearch连接中断:深入解析Connection reset by peer问题及优化策略

本文深入解析Elasticsearch连接中断问题,特别是Connection reset by peer错误的成因与解决方案。从TCP层的心跳机制到客户端与服务端的配置差异,详细介绍了网络不稳定、防火墙拦截等常见原因,并提供了六种优化策略,包括KeepAlive调整、TCP参数调优和智能重试机制等,帮助提升Elasticsearch连接的稳定性。

weixin_42546392的博客 410

编译opencv4.2时出现undefined reference to `jpeg_default_qtables‘错误的解决方案

操作系统:kylinV10 opencv版本:4.2.0 在编译opencv4.2.0的版本时,出现undefined reference to `jpeg_default_qtables’的错误提示,导致openc编译中断,不能继续编译,所以这个错误必须解决。 解决方案 查看错误的名字,根据名字分析,很有可能是当前系统中没有安装jpeg第三方库,到 http://www.ijg.org/上下载最新的源码包 jpegsrc.v9e.tar.gz,按如下顺序开始编译安装: tar -xzvf jpegsr.

jndingxin的专栏 5106

C/C++ struct位结构(位域)

从问题开始#includevoid main(){union{struct{unsigned short s1:3;unsigned short s2:3;unsigned short s3:3;}x;char c;}v;v.c=100;printf("%d/n",v.x.s3);}A:4 B:0 C:3 D:6答案是A但我在TURBO C中运行答案是1请问 是因为TURBO C 版本在原因而运行结果不一样吗?我用在TURBO C V2.0版本,能解释一下为甚么是4或1?而v.x.s1和v.x.s2的 值

zhangboyj的专栏 3万+

电力电子技术(13)——大功率可控整流电路

目录引言2.6.1 带平衡电抗器的双反星形可控整流电路电路结构的特点接平衡电抗器的原因平衡电抗器使得两组三相半波整流电路同时导电的原理分析谐波分析2.6.2 多重化整流电路概述原理目标1)移相多重联结2)多重联结电路的顺序控制3重晶闸管整流桥顺序控制带平衡电抗器的双反星形可控整流电路(是多重化整流电路的重要形式之一)的特点:适用于低电压、大电流的场合。多重化整流电路的特点:绕组的极性相反的目的:消除直流磁通势如图所示,虽然两组相电流的瞬时值不同,但是平均电流相等而绕组的极性相反,所以直流安匝(电流*匝数)互

weixin_45589295的博客 1万+

7.c++struct结构体-位域 (tcy)

位域 # “位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。 # 位域在本质上就是一种结构类型, 不过其成员是按二进位分配 1.位域定义: struct 位域结构名 { 类型符 位域名:位域长度;... };#与结构定义相仿 struct bs {int a:8;int b:2;int c:6;}; #先定义后说明 struct bs{int a:8;...

tcy-阿春 977

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤

如何修复Windows卡在“正在准备Windows”的问题?这里有详细步骤。

wyxtx的博客 5662

【SerDes】美信GMSL2-CSI调试心得

美信GMSL2加解串器芯片家族广泛应用于车载和工业视觉系统。文章介绍了MAX96717/MAX96717F加串器和MAX96724/MAX96724R解串器的关键特性,包括支持MIPI CSI-2接口、6Gbps传输速率等功能。提供了基于高通平台的demo系统配置和调试步骤,重点阐述了Link Lock、PCLK检测和Video Lock等关键调试环节,并详细说明了像素模式,隧道模式的工作原理及寄存器配置示例。文中还包含通过I2C读写寄存器的具体操作指令,取流freeze可能原因和解决方法。

qq_38089448的博客 2490

c语言结构体位域

位域   有些信息在存储时,并不需要占用一个完整的字节,   而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1   两种状态,   用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,   并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。   这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:    

apm80的专栏 1237

详解AUTOSAR:什么是AUTOSAR?(理论篇—1)

AUTOSAR是由全球各大汽车整车厂、汽车零部件供应商、汽车电子软件系统公司联合建立的一套标准协议,是对汽车技术开发一百多年来的经验总结。

不脱发的程序猿 1万+

C/C++ 位域

内存是以字节为单位进行编址的,编程语言的基本类型中,最小类型的长度一般也就是1个字节。然而,在解决某些问题时,必须要有二进制层面的表达手段(如CAN数据的解析等),又或者某些情形下根本用不着1个字节,作为强大到令人窒息的C/C++,难道没有解决方法?其提供的完美解决方法就是位域(位段)结构,本文将从定义、说明、内存布局和使用这四个方面对它进行详细的介绍。 1. 位域定义 首先,让我们看一下位域...

Captain--Jack 1197

2024年数字IC秋招-大疆-数字芯片开发工程师-笔试题

笔试题型:选择题 + 简答题笔试平台:大疆创新(电脑监控)笔试时间:90min做题感受:知识面覆盖很广,很多题目不会做(1) 什么是功耗优化中的DVFS技术?(2)降低功耗的原理是什么?(3)一般工作流程是怎样的?(4)必须的硬件模块有哪些?

qq_42135020的博客 2666

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C/C++ 结构体位域详解

本文详细介绍了C/C++中的结构体位域(bit fields),这是一种优化内存使用的特性,允许结构体成员以指定位数存储数据。位域适用于嵌入式系统、网络协议等内存敏感场景,通过紧凑数据表示节省空间。文章解释了位域的基本语法、内存布局、优势(如内存高效和代码简洁)及限制(如可移植性问题、类型和位宽限制)。示例代码展示了位域的实际应用,定义了一个设备状态结构体,并演示了位域成员的赋值与访问。需要注意的是,位域的行为依赖于编译器实现,可能存在对齐和字节序问题,因此需谨慎使用以确保跨平台兼容性。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1296

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C/C++:位域、符号扩展

目录 位域定义 符号扩展 位域使用 位域值的计算及赋值 位域的对齐原则 位域定义 什么是位域?用一个简单的例子来说,假如你在类/结构体中定义了一个变量,这个变量的取值只可能是0~3之类的(比如某种标志位),明明只需要用2个二进制位就可以存下来的,结果你必须得至少为其分配1个字节进行存储(比如用char,甚至是int),这样就至少有6个二进制位是毫无作用的,并且由于内存对...

HerofH_的博客 1382

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C/C++——位域的使用

内容先欠着

weixin_47586883的博客 1930

C/C++节约存储数据空间的方法:位域

有些时候,根据一个数据的取值范围(主要看最大取值),其在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可。例如开关只有通电和断电两种状态,用0和1表示足以,也就是用一个二进位。为了节省存储空间,并使处理简便,C/C++语言又提供了一种数据结构,叫做“位域”或“位段”。位域的定义和位域变量的说明位域定义与结构定义相仿。 struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符 位域名:位域长度。 比如,我们想用一...

zgcjaxj的博客 1832

【C语言】位域

开始正文之前,我们先聊聊自己的身份。 不知道大家怎么定义程序员这个职业的,某天,我看见一位博客上的程序媛,她是这么说的。 可以废寝忘食,也可低头沉思,可喃喃自语,也可捏手皱眉,这就是我们这群神奇的生物–程序员。 作为一名C/C++程序员,做任何事都必须有个前提:省空间,省时间,这也是我们毕生最求的目标。 开始今天的正题吧! 位域:嗯?位域是个什么东西呢?我的理解是,省空间的一种数据机构。 度娘给的回答是: 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时.

Cain Xcy的博客 1694

C/C++位域

引子: 有些信息在存储时,并不需要占用一个完整的字节(1字节=8bit),而只需占几个或一个二进制位。例如在存放一个开关变量时,只有0和1 两种状态, 用1位二进制位存储即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。 所谓“位域”是把一个字节中的二进制位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样

HAN Kai 1269

浅谈位域,以C和C++为例

一、概念 类和结构可以包含比整数类型占用更小空间的成员。 这些成员被指定为位域。 位域是一种特殊的类数据成员(结构体数据成员),用于保存特定的位数。   二、位域的数据类型 位域必须是整型数据类型,可以是signed或者是unsigned。 《C++ Primer》一书中给出:“通常最好将位域设为unsigned类型。存储在signed类型中的位域的行为由实现定义”的建议。

小太陽的专栏 3607

C/C++ 大小端、位域、内存详解

前言 面试时遇到关于大小端、位段(或者叫位域)和内存对齐的考题,然后就不知所措了。这部分对于嵌入式底层工作者是必须要掌握的,其他方面不是必须的;但还是很有必要学习理解这些知识点,因为它可以让你更了解C++的,了解程序在内存的运行情况,也能加深对计算机系统的理解。 1、大小端 在现代的“冯.诺依曼体系结构”计算机中,计算机内的数制都是采用二进制来存储,并且是以8位,一个字节为...

烛火飞蛾 961

C :位域实现与对齐

C/C++中以一定区域内的位(bit)为单位来表示的数据成为位域,位域必须指明具体的数目。位域的作用主要是节省内存资源,使数据结构更紧凑。 REF: https://www.cnblogs.com/pure/archive/2013/04/22/3034818.html 位数组 :https://blog.youkuaiyun.com/qq_37375427/article/details/7979...

鱼藏剑 718

联合体 位域结构体_C/C++中的位域

各种基本数据类型中,长度最小的 char 和 bool 在内存中占用一个字节的空间,但对于某些数据类型只需要几个二进制位即可保存,例如:enum GameResult { WIN, LOSE, TIE, CANCEL };由于它只有四种取值,只需要两个二进制位就可保存,而一个 GameResult 类型变量至少要占1个字节(8个二进制位),在很多编译器中,甚至还会占据更多的空间。单一变量所浪费的空...

weixin_39936134的博客 520
上一篇: 四行大写字符统计直方图
下一篇: 一个字符串编码问题的程序解决
Soloe
博客等级 码龄21年 14粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值