页面版权所有©ob欧宝最新地址 地址:浙江省湖州市创业大道111号 123黔ICP备17003352号-3

网站地图杭州

C语言中的位域是什么?
产品名称

C语言中的位域是什么?

没有此类产品
项目详细介绍

  只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位。正是基于这种考虑,C语言又提供了一种叫做位域的数据结构。 在结构体定义时,我们可以指定某个成员变量所占用的二进制位数(Bit),这就是位域。请看下面的例子:

  对于 n 和 ch,第一次输出的数据是完整的,第二次输出的数据是残缺的。 第一次输出时,n、ch 的值分别是 0xE、0x24($ 对应的 ASCII 码为 0x24),换算成二进制是1110、10 0100,都没有超出限定的位数,能够正常输出。 第二次输出时,n、ch 的值变为 0x2d、0x7a(z 对应的 ASCII 码为 0x7a),换算成二进制分别是10 1101、111 1010,都超出了限定的位数。超出部分被直接截去,剩下1101、11 1010,换算成十六进制为 0xd、0x3a(0x3a 对应的字符是 :)。

  C语言标准规定,位域的宽度不能超过它所依附的数据类型的长度。通俗地讲,成员变量都是有类型的,这个类型限制了成员变量的最大长度,:后面的数字不能超过这个长度。

  例如上面的 bs,n 的类型是 unsigned int,长度为 4 个字节,共计 32 位,那么 n 后面的数字就不能超过 32;ch 的类型是 unsigned char,长度为 1 个字节,共计 8 位,那么 ch 后面的数字就不能超过 8。 我们可以这样认为,位域技术就是在成员变量所占用的内存中选出一部分位宽来存储数据。

  但编译器在具体实现时都进行了扩展,额外支持了 char、signed char、unsigned char 以及 enum 类型,所以上面的代码虽然不符合C语言标准,但它依然能够被编译器支持。

  C语言标准并没有规定位域的具体存储方式,不同的编译器有不同的实现,但它们都尽量压缩存储空间。位域的具体存储规则如下:

  当相邻成员的类型相同时,如果它们的位宽之和小于类型的 sizeof 大小,那么后面的成员紧邻前一个成员存储,直到不能容纳为止;如果它们的位宽之和大于类型的 sizeof 大小,那么后面的成员将从新的存储单元开始,其偏移量为类型大小的整数倍。

  m、n、p 的类型都是 unsigned int,sizeof 的结果为 4 个字节(Byte),也即 32 个位(Bit)。m、n、p 的位宽之和为6+12+4 = 22,小于 32,所以它们会挨着存储,中间没有缝隙。 sizeof(struct bs)的大小之所以为 4,而不是 3,是因为要将内存对齐到 4 个字节,以便提高存取效率。 如果将成员 m 的位宽改为 22,那么输出结果将会是 8,因为22+12 = 34,大于 32,n 会从新的位置开始存储,相对 m 的偏移量是sizeof(unsigned int),也即 4 个字节。 如果再将成员 p 的位宽也改为 22,那么输出结果将会是 12,三个成员都不会挨着存储。

  当相邻成员的类型不同时,不同的编译器有不同的实现方案,GCC 会压缩存储,而 VC/VS 不会。

  1structbs{ 2unsignedm:12; 3unsignedch; 4unsignedp:4; 5}; 在各个编译器下 sizeof 的结果都是 12。 通过上面的分析,我们发现位域成员往往不占用完整的字节,有时候也不处于字节的开头位置,因此使用&获取位域成员的地址是没有意义的,C语言也禁止这样做。地址是字节(Byte)的编号,而不是位(Bit)的编号。

  1structbs{ 2intm:12; 3int:20;//该位域成员不能使用 4intn:4; 5}; 无名位域一般用来作填充或者调整成员位置。因为没有名称,无名位域不能使用。 上面的例子中,如果没有位宽为 20 的无名成员,m、n 将会挨着存储,sizeof(struct bs)的结果为 4;有了这 20 位作为填充,m、n 将分开存储,sizeof(struct bs)的结果为 8。

  文章出处:【微信号:mcu168,微信公众号:EDA365电子论坛】欢迎添加关注!文章转载请注明出处。

  Lexar雷克沙的专业性和高品质值得肯定。Lexar雷克沙始终在不断输出高质量的产品,广泛满足全球消....

  大家上午好! 今天为大家讲解C语言“函数”深入剖析,请持续关注,会持续进行更新! 前期回顾: ...

  #include#include#define uchar unsigned char#define uint unsigned intuchar code CCW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,...

  在你的C语言代码中,不知能否看到类似下面的代码: 这好像没有什么问题,你应该还会想:“嗯⋯是啊,我们....

  带定位系统的离心式微流控平台研究与设计 随着医疗水平和人民健康意识的提高,血液检测相关的医疗器械越来越受关注。目前国...

  开头的话 嵌入式开发是一个比较苦、容易背锅、可能仍然需要996而且拿钱较少,但也有些许乐趣的活,我一....

  c语言的面向对象框架(以RT-Thread软件包rt-robot为例)概述  有一种说法是c语言是一门面向过程的语言,其实这种说法是比较...

  尽管现在固态硬盘大行其道,不少人甚至觉得固态硬盘取代机械硬盘的时候到来了,但是我们别忘了,硬盘最重要的还是存储功能,存储...

  东数西算”工程正式启动,“东数西算”背景下,IPFS分布式存储迎来重大机遇 2021年5月26日,国....

  在程序开发过程中,大家都会去点击编译按钮,直接开始仿真调试,基本上不怎么关注编译和链接的过程,因为我们使用的工具一般都是...

  电容器是众多电子元器件中最为常见的一种产品,其应用的范围非常之广。在国内外也有许多大厂商做的非常好,....

  前言在大数据分布式中,分区,分桶,分片是设计框架的重点。此篇就来总结各个框架。建议收藏 目录 Hiv....

  反馈交流或在此文章底部留言补充~HEIDENHA海德汉密码一、从海德汉网站上下载的压缩文件解密需要的密码是:SHB95148二...

  1、Marlin2.0 参数存储M命令Marlin2.0 的存储功能主要依靠 EEPROM 来进行,Marl......

  本发明涉及网线排布技术领域,尤其涉及一种高效简洁的计算机网络布线设计方法。背景技术:网线主要用于连接局域网、广域网,常见...

  【飞测生物真菌毒素检测仪】粮食跟我们每个人的生活都是密切相关的,可能有很多人不了解,粮食在生长之后,....

  C -与ORACLE直接连接代码(肇庆理士电源技术有限)-C#-与ORACLE直接连接代码,有需要的....

  本文介绍ADI SHARC DSP图形化开发,在一般我们都是使用vdsp++进行c语言开发的,但其实....

  C语言是一种高级语言,在大多数情况下C语言的代码是和具体的处理器体系结构无关的。然而,在嵌入式系统的....

  科技视讯 8月18日,西部数据于上海电影博物馆正式发布专为影音内容创作者和专业人士所打造的高品质存储....

  最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传....

  4K视频,VR/AR,高分辨率相机,曾几何时这些看似离我们还那么遥远的技术,如今已经出现在我们生活的....

  毫无疑问,手机正在成为全球用户手中连接互联网的重要终端。尤其是随着5G技术的普及,智能手机开始承载越....

  5G网络峰值速率在1Gbit/s左右,为4G网络速度的10倍,1GB的文件,10秒左右就可以下来,可....

  题目 已知二叉树前序为 ABDFGCEH 后序序列为 BFDGACEH ,要求输出后序遍历为 FGD....

  固态硬盘是用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元组成。在军事、车载、工控、视频监控....

  Verilog HDL 优点:类似C语言,上手容易,灵活。大小写敏感。在写激励和建模方面有优势。 缺....

  全民创作时代下,越来越多普通人正在加入创作者大军。无论是普通人还是专业内容创作者,获取和创作的内容都....

  程序员可能无意识的传递了错误参数;外界的强干扰可能将传递的参数修改掉,或者使用随机参数意外的调用函数....

  随着移动互联网的迅速发展,智能手机也逐渐成为了我们日常生活当中不可缺少的一部分。但随着各类APP功能....

  数字存储示波器(DSO)吸引力大,因为它可以存储波形信号平均,支持各种触发和分析选项。然而,数字存储....

  农作物种质资源主要是用来对种质资源的进行存储和管理,在我国种植行业的发展中发挥着重要的作用。本文主要....

  企业不要忽视一些主要的数据存储问题,其中包括与人员、安全和成本相关的问题,而如果没有适当的规划,它们....

  编程时,我们讲究的是高内聚低耦合,在协同开发、代码移植、维护等环节都起到很重要的作用。 一、原理篇而....

  vim 编辑超大文件,打开很慢,因为会读一遍文件( readfile ),保存的时候很慢,因为会读写....

  最近作者在做一个项目,遇到一个问题,运行于ARM上的threadx在与DSP通信采用消息队列的方式传....

  前言: 之前有朋友跟我讨论过一个问题,他问在java中,i=1;i=i++;之后的结果时什么,我一开....

  对于很多有高性能计算需求的用户来说,通常比较关注的是计算的硬件配置是否是最新的,因为这往往关系到计算....

  电脑之家 数据正在快速增长,根据预测,到2024年全世界每年产生的数据总量将会达到143ZB。快速增....

  即便受到疫情的严重影响,大大小小的PC生产商在过去的2020年仍旧卖出了3.02亿台PC。而在经济快....

  计算机世界 2021年是开放计算项目(OCP)诞生的10周年。 熟悉IT行业的人都知道,数字经济的发....

  日前,存储性能委员会(Storage Performance Council,简称SPC)公布最新的....

  2021年7月27日,主题为“开放计算再十年:降碳·增效·践行”第三届 OCP China Day在....

  当前,全球正进入数字经济时代。大量新技术和新商业应用,将催生出对边缘计算和数据中心的海量需求。据互联....

  视频创作者如何选储存设备?aigo国民好物移动固态硬盘 S7 Pro告诉你 作为一个视频创作者,面对....

  有读者提出了类似这样的问题:while(1) 和 for(;;) 它们不都是无限循环吗,作用应该一样....

  前言 为了能在市场上有更大的突破,才刚进入下半年,存储厂商们便纷纷推出各式各样的M.2 NVMe新品....

  电脑存储空间告急怎么办?aigo移动固态硬盘S7 Pro帮你轻松应对 不知道Macbook的用户是不....

  2021年Web 3.0中国峰会暨区块链分布式存储行业大会于7月15日成都世纪城新国际会展中心举....

  随着SSD进入PCIe 4.0时代,其读取速度也已经超过了7GB/s。不少用户在选购SSD时,速度自....

  科技的发展加速了许多行业的发展,云计算的日渐成熟也在不断地重塑着生命科学行业,从而使得传统的药物研发....

  嵌入式DSP系统C语言硬件编程技术(计算机三级嵌入式开发技术)-该文档为嵌入式DSP系统C语言硬件编....

  嵌入式DSP系统C语言硬件编程技术总结(北京嵌入式开发招聘)-该文档为嵌入式DSP系统C语言硬件编程....

未找到相应参数组,请于后台属性模板中添加
暂未实现,敬请期待
暂未实现,敬请期待
上一篇:新兴建设:携12个沉浸式工程案例参加服贸会 下一篇:C语言:结构体、联合体嵌套使用的实用操作