结构体:位段(C语言进阶)(二)

news2024/11/18 1:28:11

目录

前言

2、位段

2.1 什么是位段

2.2 位段的内存分配

2.3 位段的跨平台问题

2.4 位段的应用

总结


前言

        C语言除了有其内置类型,还有自定义类型。因为在实际运用中,我们可能会遇到一类数据,它的内容是由多种数据组成的,例如:一个学生的个人信息,它就包含了姓名、年龄、学号等等。这些数据并不是统一的类型,因此不能用C语言本身的数组去定义,那如果我们需要将其放在一个变量中时,我们就可以运用到结构体了。结构体的出现就是用来处理这样的内容数据不统一的变量,这给了编程者很大的操作空间,使得编程更加灵活自由。

        接上篇本篇继续往下深入。

2、位段

2.1 什么是位段

        位段是由结构体实现的,位段的声明和结构体是类似的,有两个不同:

        1、位段的成员必须是整型家族的变量:int、unsigned int、signed int、char等等

        2、位段的成员名后边有关冒号和一个数字。

        比如:

struct A
{
	int _a : 2;
	int _b : 5;
	int _c : 10;
	int _d : 30;
};

        这就是一个位段类型。如果把“:”它后面的数字去掉,那么其就是一个结构体。

        冒号加后面的数字是什么意思?

        冒号加数字表示给这个变量分配的空间比特位大小。那这样有什么作用呢?

        举个例子,如果我们有一个变量flag,它的作用是表示真假,因此flag的取值只有0和1两种情况,所以对于flag变量来说,它不需要4个字节的空间,所以我们可以用位段将其设置为2bit。

        位段的声明其实就是用来节省空间的。位段只能在结构体里面用。

        下面我们分析一下,上面那个例子的空间大小,单位字节。

int main()
{
	printf("%d", sizeof(struct A));
	return 0;
}

        答案是8。是如何计算的,下面来分析:

        首先,我们位段A里面的内容是int类型,因此,在开辟空间时,按照每次4个字节的大小来开辟。先开辟4个字节(32个bit),发现,存放 _a ; _b ; _c 需要17个bit,那么还剩下15个bit位,不够放 _d,因此计算机会再开辟4个字节(32个bit)的空间,此时该位段大小来到了8字节。因此该位段式结构体大小为8个字节。

        注意,冒号后面的数字是不能超过其类型的大小。比如,对于int类型,冒号后面的数字不能大于32。

2.2 位段的内存分配

        举个例子:

struct S
{
	char a : 3;
	char b : 4;
	char c : 5;
	char d : 4;
};
int main()
{
	struct S s = { 0 };
	s.a = 10;
	s.b = 12;
	s.c = 3;
	s.d = 4;
	return 0;
}

        我们通过画图来了解一下,再vs2019中,位段是如何分配内存的。

        最终的存放结果为:

        程序运行,看看内存是否是如此存储:

        从右边监视图可以看出,内存中存储的的确是62 03 04,符合我们的分析。

2.3 位段的跨平台问题

        对于我们上面的分析,都是基于vs2019这个平台来说的,如果换一个平台,结果可能就不一样,原因是,对于不同平台:

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

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

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

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

        总结:

        跟结构体相比,位段可以达到同样的效果,但是可以很好的节省空间,但是有跨平台的问题存在。

2.4 位段的应用

        这是位段的常见运用,当我们在网上传输信息时,我们会将其用位段进行封装,像上图的一个包装,它包含了:4位版本号;4位首部长度;8位服务器类型;16位总长度等等,每一个数据都限定了长度,如果不这么做,那么每一个数据都要申请一个int类型的大小或是double类型的大小,这样的一整个信息会占用很大的空间,在互联网上,信息所占空间越小,传输会越顺畅,因此我们用位段去适当减小信息的大小,达到信息传输更迅速的目的。

总结

        关于结构体中的位段这部分内容,就讲到这里了,希望对大家有所帮助。

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

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

相关文章

27.基于springboot + vue实现的前后端分离-网上租赁交易系统(项目 + 论文)

项目介绍 本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上租贸系统,来满足用户网络商品租赁的需求。本网上租贸系统应用Java技术,MYSQL数据库存储数据,基于Spring Boot框架开发。在网站的整个开发过程中,首…

centos离线安装 k8s (实操可用)

全部安装包rpm下载(已整理好k8s和docker):链接:https://pan.baidu.com/s/1ATv8BPijhvIKWz4hMnkx6Q?pwdt5db 提取码:t5db 将文件下载以后,解压到服务器 #执行所有docker-rpm包 yum -y localinstall *.rpm…

【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 CSS层叠样式表语法基础

🚀 个人主页 极客小俊 ✍🏻 作者简介:web开发者、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 什么是CSS?…

【机器学习】详解正则化思想

我们的生活当中真正有意义或者有价值的部分可以概括为两句话:一句话是:弄清楚某个东西是怎么一回事,另一句话是,弄清楚某个东西是怎么一回事。头一句话,我们弄清楚的那个东西对于我们而言是未知的,但是已经…

(学习总结)如何使用ChatGPT API训练自定义知识库

第一步: 安装OpenAI、GPT Index、PyPDF2和Gradio库 pip install openai pip install gpt_index pip install PyPDF2 pip install gradio 第二步:用VScode代码编辑器写app.py代码 记得替换api密钥 from llama_index import SimpleDirectoryReader, …

企智汇:引领企业项目管理的数字智能化管理系统工具!

随着数字化时代的来临,企业对项目管理的要求也日益增高。面对日益复杂的业务流程和海量数据,如何有效地管理项目、整合资源、优化流程、提高管理效率,成为了摆在企业面前的重要课题。在这样的背景下,专业做了10年项目管理系统的&a…

提高数字化处理质量和效率:重视OCR软件的识别准确率

在当今数字化时代,纸质文件的数字化处理变得尤为重要。而作为纸质文件数字化的关键工具之一,OCR(Optical Character Recognition,光学字符识别)软件的识别准确率对于将大量纸质文件转为Excel具有至关重要的地位。本文将…

Uninty 鼠标点击(摄像机发出射线-检测位置)

平面来触发碰撞,胶囊用红色材质方便观察。 脚本挂载到胶囊上方便操作。 目前实现的功能,鼠标左键点击,胶囊就移动到那个位置上。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c6 : MonoBe…

2024年AI辅助研发的技术革新与应用展望

文章目录 每日一句正能量前言AI辅助研发的技术进展全球AI应用呈现出百家争鸣、百花齐放态势,加速向各行各业渗透AI应用显著促进效率提升,“劳动替代低创造性脑力替代”正在加速形成 面临的挑战与机遇未来趋势预测后记 每日一句正能量 要理解这样的自己。…

智能部署之巅:Amazon SageMaker 引领机器学习革新

本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道。 (全球 TMT 2023年12月6日讯)亚马逊云科技在 2023 re:Invent 全…

IEEE投稿无法上传文件问题(An error has occurred.Please try again......)

投稿上传手稿出现: An error has occurred. Please try again. If the problem persists, please contact the Support Team for more information and instructions. The Support Teams contact information can be obtained by clicking the ‘Help’ link in the…

24/03/07总结

esayx: 贪吃蛇: #include "iostream" #include "cmath" #include "conio.h" #include "easyx.h" #include "time.h" #define NODE_WIDTH 40 using namespace std; typedef struct {int x;int y; }node; enum direction /…

融资项目——通过OpenFeign在分布式微服务框架中实现微服务的远程调用

1.OpenFeign配置 首先&#xff0c;在需要调用其他的微服务的微服务中引入相关依赖。&#xff08;大多数项目中各微服务需要互相调用&#xff0c;可以直接在每个微服务中引入依赖&#xff09; <!--服务调用--><dependency><groupId>org.springframework.clou…

非科班如何系统自学Python?

在数字化时代&#xff0c;Python如一位“全能选手”在编程语言的舞台上大放异彩&#xff0c;无论是数据科学、网站开发还是人工智能&#xff0c;它都能游刃有余地驾驭各种挑战。正因如此&#xff0c;越来越多的人渴望掌握这门兼具强大功能和优雅简洁的语言。 目录 引言 开始 …

pytorch(四、五)用pytorch实现线性回归和逻辑斯蒂回归(分类)

文章目录 线性回归代码过程准备数据设计模型设计构造函数与优化器训练过程训练代码和结果pytorch中的Linear层的底层原理&#xff08;个人喜欢&#xff0c;不用看&#xff09;普通矩阵乘法实现Linear层实现 回调机制 逻辑斯蒂回归模型损失函数代码和结果 线性回归 代码过程 训…

jumpserver项目配置讲解

下载地址&#xff1a;https://community.fit2cloud.com/#/products/jumpserver/downloads 产品文档&#xff1a;https://docs.jumpserver.org/zh/v3/ [rootbogon ~]# tar -xf jumpserver-offline-installer-v3.9.3-amd64.tar.gz [rootbogon ~]# cd jumpserver-offline-instal…

Python Tkinter GUI 基本概念

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;如果停止&#xff0c;就是低谷&#xf…

【机器学习】实验6,基于集成学习的 Amazon 用户评论质量预测

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;此次代码开源大家可以自行参考学习 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟…

Go的安装

一. 下载地址 Go官方下载地址&#xff1a;https://golang.org/dl/ Go中文网&#xff1a;https://go.p2hp.com/go.dev/dl/ 根据不同系统下载不同的包。 二. 配置GOPATH GOPATH是一个环境变量&#xff0c;用来表明你写的go项目的存放路径。 GOPATH路径最好只设置一个&#xff0…

C++ 特殊的类设计

目录 1.请设计一个类&#xff0c;不能被拷贝 2. 请设计一个类&#xff0c;只能在堆上创建对象 3. 请设计一个类&#xff0c;只能在栈上创建对象 4. 请设计一个类&#xff0c;不能被继承 5. 请设计一个类&#xff0c;只能创建一个对象(单例模式) 1.请设计一个类&#xff0c;…