【进阶C语言】什么?你居然还不知道结构体可以实现位段?一文带你速通位段结构的使用

news2024/11/16 13:05:13

目录

🤩前言🤩: 

🤯正文:位段🤯:

        1.位段概述:

        2.位段的内存分配:

        3.位段的跨平台问题:

        4.位段的应用:

🥳总结🥳:


🛰️博客主页:✈️銮同学的干货分享基地

🛰️欢迎关注:👍点赞🙌收藏✍️留言

🛰️系列专栏:💐【进阶】C语言学习

        家人们更新不易,你们的👍点赞👍和👉关注👈真的对我真重要,各位路过的友友麻烦多多点赞关注,欢迎你们的私信提问,感谢你们的转发!

        关注我,关注我,关注我,你们将会看到更多的优质内容!!


🏡🏡本文重点 🏡🏡:

🚅 位段概述 🚃 位段的内存分配 🚏🚏

🚅 位段跨平台问题 🚃 位段应用 🚏🚏

🤩前言🤩: 

        上节课中我们学习了有关结构体的声明、定义、初始化与自引用等语法结构,也学习了结构体内存对齐的大小计算方法,还学习了结构体传参的实际应用。经过这些知识的学习,我们对结构体各种功能的认识和使用就有了足够的了解。而今天我们要学习的,是学习完结构体后,对结构体内容的一点点补充,但也是结构体的一项很重要的能力——实现位段

🤯正文:位段🤯:

        在前面我们完整的学完了结构体的语法结构和使用方法,在学完结构体之后,我们就要研究研究结构体实现位段的重要能力了。

        1.位段概述:

         位段(bit-field)以位为单位来定义结构体(或联合体)中的成员变量所占的空间。含有位段的结构体(联合体)称为位段结构。采用位段结构既能够节省空间,又方便于操作

        位段的声明和结构体十分相似,但同时有两个不同点

1. 位段的成员必须是 intsigned int 、 unsigned intchar 类型。

2. 位段的成员名后边有一个冒号和一个数字(该成员所占内存空间大小,单位为 bit位)。

        例如:

#include<stdio.h>

struct test
{
	int _a : 2;
    //成员 a 只占用 2 个比特位

	signed int _b : 5;
    //成员 b 只占用 5 个比特位

	unsigned int _c : 10;
    //成员 c 只占用 10 个比特位

	char _d : 4;
    //成员 d 只占用 4 个比特位
};

int main()
{
	printf("The size of struct test is %d\n", sizeof(struct test));
	return 0;
}

        采用位段结构的好处是能够节省大量的空间,通过有条件地(根据实际使用需求)限制每个变量所占内存空间的大小,从而减少了整体结构的空间占用

        2.位段的内存分配:

        位段存在的意义便是最大程度上去减少空间的浪费,所以在进行存储时,位段不会进行内存对齐操作。那么位段的内存空间是如何进行分配的呢?我们接下来就对位段的内存分配进行研究。

        在这里各位小伙伴们一定要注意!位段的内存分配并没有严格的规则在不同的编译器上产生的结果可能不同,我们今天的讲解,将以 Visual Studio 2022 为例进行研究。

        我们同样首先需要知道位段进行内存分配的规则

1. 位段的成员可以是 int unsigned intsigned int 或者是 char(属于整形家族)类型

2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。

3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。

4. 位段的内存分配是逐4字节(一个 int 类型的大小)进行分配的。

5. 当字节内空间不足以放下下一个成员变量时剩余的空间不再使用,而是再从内存中申请一个字节的空间继续分配

6. 不同类型(char 与 int类型)数据进行存储时将会另起4个字节(一个 int 类型的大小)进行存储。

        就以我们上面的代码段(32位平台)为例,我们对其进行分析:

        首先向内存申请4个字节(一个 int 类型)的空间开始分配,第一个成员 int 类型变量 _a 所占的内存空间为 2 比特位

\第一个4字节(一个 int 类型大小)
bit1234567891011121314151617181920212223242526272829303132
变量_a

        接着,按照顺序将占据 5 比特位的第二个成员 signed int 类型变量 _b 存入:

\第一个4字节(一个 int 类型大小)
bit1234567891011121314151617181920212223242526272829303132
变量_a_b

        然后继续依次将占据 10 比特位的第三个成员 unsigned int 类型变量 _c 存入:

\第一个4字节(一个 int 类型大小)
bit1234567891011121314151617181920212223242526272829303132
变量_a_b_c

        最后再根据规则,前三个成员类型均为 int 类型,而第四个成员类型为 char 类型,于是又向内存申请了第二个四字节(一个 int 类型)的空间,并向里面存入了占据 4 比特位的 char 类型变量 _d

\第一个4字节(一个 int 类型大小)
bit1234567891011121314151617181920212223242526272829303132
变量_a_b_c
\第二个4字节(一个 int 类型大小)
bit1234567891011121314151617181920212223242526272829303132
变量_d

        至此,该位段结构的内存分配结束共占据两个 int 类型数据的大小,即 8 个字节

        3.位段的跨平台问题:

        我们上面说过,位段涉及很多不确定因素,位段是不跨平台的注重可移植的程序应该避免使用位段,并且在未来位段结构的使用过程中,我们一定要提前仔细地研究好位段在不同编译器下使用时,究竟是如何进行内存分配的,再结合我们的实际需求实现跨平台使用。

        而在位段进行跨平台使用时,我们通常需要注意以下四个关键点

1. int 位段被当成有符号数还是无符号数是不确定的

2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题)

3. 位段中的成员在内存中从左向右分配还是从右向左分配的标准尚未定义

4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的

        总结下来,跟结构相比,位段可以达到跟结构相同的效果,并且可以更好的利用空间,但同时存在着跨平台问题

        4.位段的应用:

\1234567891011121314151617181920212223242526272829303132

20

字节

4位版本号

4位首部长度

8位服务类型16位总长度
16位标识符3位标志13位片偏移符
8位生存时间8位协议16位首部校验
32位源地址IP
32位目的地址IP
32位选项(如果有)
数据

🥳总结🥳:

        到这里,我们关于位段这个内容的相关知识就介绍完毕了,再加上上一篇关于结构的讲解,我们关于结构体的所有内容的学习就全部结束了。希望能对各位小伙伴们关于结构的学习有所帮助,能为大家在将来的面试和工作中起到一些作用!也希望各位小伙伴们下去以后多多思考和练习,可以尝试在不同平台和不同编译器下运行,更全面的了解结构的原理和使用。

        🔥🔥如果有天我们湮没在人潮中,庸碌一生,那是因为我们没有努力要活的丰盛🔥🔥

        更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~  你们的点赞和关注对我真的很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/97681.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]Node.js计算机毕业设计好又多百货商业广场有限公司自助收银操作系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

三面美团测开岗,HR 现场直接发 offer,他是横着走出来的

前情提要 这是一个发生在我朋友身上的真实事情&#xff1a; 这里就叫他程序员 Y 吧。 程序员 Y 工作不到两年&#xff0c;周末在朋友圈发了个喜报&#xff0c;准备入职美团。 之后&#xff0c;我就带着祝福跟 Y 聊了许久&#xff0c;聊天的内容就是具体了解一下他面试的过程…

事业编招聘:气象局2023年度公开招聘公告

宁夏回族自治区气象局2023年度公开招聘应届高校毕业生公告&#xff08;气象类&#xff09; 根据《事业单位人事管理条例》《事业单位公开招聘人员暂行规定》和《气象部门事业单位公开招聘应届高校毕业生管理办法&#xff08;试行&#xff09;》等有关规定和工作需要&#xff0…

C++ 面向对象

C 面向对象&#xff0c;内存管理&#xff08;未完。。。&#xff09; 对象内存模型 类型转换 dynamic_cast type_info 多态 虚函数 override final虚表结构 运行时类型信息&#xff08;RTII&#xff09;基类析构函数必须为虚函数&#xff0c;否则会有内存泄漏的危险继承有两…

GitHub 推出对所有公共存储库的免费秘密扫描

GitHub 正在推出对其代码托管平台上所有公共存储库的免费扫描公开秘密&#xff08;例如凭据和授权令牌&#xff09;的支持。 秘密扫描是一种安全选项&#xff0c;组织可以启用它以进行额外的存储库扫描&#xff0c;以检测已知类型的秘密的意外暴露。 它通过匹配合作伙伴和服务…

【Java编程系列】Mybatis的Interceptor注入yml自定义变量,多种实现方式

1、前言 当前有一个任务&#xff0c;需要将mybatis的sql进行拦截过滤处理&#xff0c;而拦截处理时&#xff0c;需要有一些白名单放行的配置方法名路径。所以&#xff0c;这里使用到了yml的配置文件来配置变量路径&#xff0c;而后引入拦截器做动态放行。 2、注入自定义变量方式…

5点起床,一直干到11点的外卖小哥转行程序员,入职起薪12K

“我是要成为卷王的男人”是95后的小魏的座右铭&#xff0c;曾经的他5点起床&#xff0c;10分钟洗漱完毕就开始了一天的工作—送外卖。是的&#xff0c;曾经的他是万千外卖小哥的其中一员。 19年毕业的小魏学的是土木工程&#xff0c;曾经他也在工地待过&#xff0c;风尘仆仆却…

教程!!!!!

使用门槛&#xff1a;需要自行准备能开全局代理的科学工具 好评赠送免费科学工具&#xff0c;也可以自己准备科学工具。 下单以后&#xff0c;我们会发送一串账号密码给您。如图&#xff1a; 其中卡号就是chatgpt的账号&#xff0c;密码就是chatgpt密码。 第一步&#xff1…

星火计划学习笔记——第八讲Apollo控制模块解析与实践1

文章目录1. 控制理论简介1.1 控制的作用1.2 自动驾驶控制的目标1.3自动驾驶控制器的设计2. 汽车运动学与动力学2.1 常用的自动驾驶控制算法2.2 车辆运动学模型 Kinematics2.3 车辆动力学模型 Dynamics3. Apollo控制模块3.1 Apollo控制模块3.2 规划与控制相配合3.3 Apollo控制模…

零基础学习编程,选择什么编程语言比较合适?

随着互联网的兴起&#xff0c;越来越多的人想要学习编程&#xff0c;却不知道该从哪开始学&#xff0c;小编就通过以下几点给大家分析一下&#xff0c;零基础入门学习编程&#xff0c;该如何选择编程语言。 1、哪一门语言容易入门&#xff01; 所有语言的知识体系分为三大块&…

SAP ABAP 物料主数据的视图维护状态

SAP ABAP 物料主数据的视图维护状态 引言&#xff1a; 物料主数据的视图维护状态会经常使用&#xff0c;是物料主数据批量创建/修改的逻辑路由。 关键字&#xff1a;SAP ABAP VPSTA PSTAT T132T 文章目录SAP ABAP 物料主数据的视图维护状态1. 技术说明2. 维护状态3. 维护记录…

Linux——实用指令

帮助指令 man 获得帮助信息 基本语法 man [命令或配置文件] 注意&#xff1a;命令可以组合使用&#xff0c;比如ls -al&#xff0c;ls -la help 获得shell内置命令的帮助信息 基本语法 help命令 时间日期类 date指令 显示当前日期 基本语法 date&#xff08;显示…

【细胞分割】原子力显微镜图像分析【含GUI Matlab源码 1371期】

⛄一、AFM简介 理论知识参考文献&#xff1a;原子力显微镜&#xff08;AFM&#xff09;图像的计算机辅助分析 ⛄二、部分源代码 function varargout AFManalysis(varargin) % AFMANALYSIS M-file for AFManalysis.fig % AFMANALYSIS, by itself, creates a new AFMANALYSIS…

【图像处理】高效斑点特征提取技术研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

10年经验Python老司机分享:转行如何自学Python并且找到工作?

目前信息化产业发展势头很好&#xff0c;互联网就成为了很多普通人想要涉及的行业&#xff0c;因为相比于传统行业&#xff0c;互联网行业涨薪幅度大&#xff0c;机会也多&#xff0c;所以就会大批的人想要转行来学习Python开发。 零基础学习Python必须明确的几点&#xff1a; …

5个千兆网口,将有什么样高速网络传输体验?——米尔MYD-J1028X开发板实测分享

本篇测评由电子工程世界的优秀测评者“HonestQiao ”提供。 此次的板卡测试&#xff0c;是米尔MYD-J1028X开发板的高速网络数据传输测试体验。 01 本次测试的主角 米尔MYD-J1028X开发板提供了5个超级给力的最高支持千兆网络接口&#xff0c;具体如下&#xff1a; 通过查看官…

基于AD936X+Intel FPGA的射频方案

基于ADI AD936X和Intel Cyclone V FPGA的射频方案&#xff0c;适合于无线通信基础设施、防务电子系统、RF测试设备和仪器以及通用软件定义无线电平台等应用。 关于ADI AD936X系列射频收发器 AD936X系列的工作频率范围覆盖从70 MHz到6 GHz。它是一系列完整的无线电设计&#x…

底层网络知识详解:最重要的传输层-第11讲-TCP协议(上):因性恶而复杂,先恶后善反轻松

上一节,我们讲的UDP,基本上包括了传输层所必须的端口字段。它就像我们小时候一样简单,相信“网之初,性本善,不丢包,不乱序”。 后来呢,我们都慢慢长大,了解了社会的残酷,变得复杂而成熟,就像TCP协议一样。它之所以这么复杂,那是因为它秉承的是“性恶论”。它天然认…

Dubbo 4 Dubbo 高级特性 4.2 Dubbo 常用高级配置 4.2.7 集群容错 4.2.8 服务降级

Dubbo 【黑马程序员Dubbo快速入门&#xff0c;Java分布式框架dubbo教程】 4 Dubbo 高级特性 文章目录Dubbo4 Dubbo 高级特性4.2 Dubbo 常用高级配置4.2.7 集群容错4.2.8 服务降级4.2 Dubbo 常用高级配置 4.2.7 集群容错 【一个场景】 现在 服务 提供者 部署成 了一个集群&a…

痞子衡嵌入式:我被邀请做科锐国际旗下数科同道主办的技术沙龙嘉宾

「数科同道」是「科锐国际」旗下的面向技术开发者的专属垂直招聘平台。《数科同道技术沙龙》是由数科同道主办的活动&#xff0c;每期活动邀请行业内及其他知名公司的技术专家分享来自一线的实践经验。自2022年12月起&#xff0c;数科同道将在苏州&#xff0c;聚焦嵌入式行业及…