【C语言】位段详解

news2024/10/5 20:18:58

前言

上一篇文章,我们学习了结构体的相关知识,今天我们来学习和结构体很像的位段
自定义类型:结构体

位段

位:指的是二进制位

位段的声明

位段与结构体的声明有两个不同:

1.位段的成员必须是 int、unsigned int 或signed int 。

成员类型是固定的:char类型也可以,但不要char和int类型混用,类型要保证一致

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

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

第三点在“位段的不跨平台性”会详细介绍

例子

struct A
{
	int a : 2;
	int b : 3;

};

位段的大小

下面代码的运行结果是什么

struct S
{
	int a : 2;
	int b : 5;
	int c : 10;
	int d : 30;

};

int main()
{
	struct S s;
	printf("%zd\n", sizeof(s));

	return 9;
}

结果:8byte

解释

位,在开始时.提到了,是二进制位(bit位)

我们假设a的范围是0~4,不会更大也不会更小,那么a就不需要用那么大的空间(32个bit位)去存储,它只需要2个bit位就能存储

所以,成员名冒号后面的数字指的就是:用多少个bit位去存储这个成员(数字不能超过类型的最大bit位数)

按照这么算
2+5+10+30 == 48,但结果不对

下面就来介绍位段的内存分配

位段的内存分配

struct S
{
	int a : 2;
	int b : 5;
	int c : 10;
	int d : 30;

};

还是这段代码
我们都知道,int类型是32个bit位
a、b、c共占用了17个bit位,剩下15个bit位,存不下d(30个bit位)
就开辟新的整型空间存储d
所以,总大小就是8个字节

这样就很节省空间了

例题

下面通过这段代码,来讲解一下是如何存储的

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;
}

开辟空间

根据上面的规则,开辟出三个字节存储a、b、c、d
(如何存储后面会做说明)

在这里插入图片描述

赋值

a是10,二进制表示就是:1010
但a只能存储三个bit位,所以此处存的是010

b是10100,只能存四个bit位,是0100

c是011,c有5个bit位,
不够,那就高位为0

d存储的是0100

所以最终存储的就是:
0010 0010 0000 0011 0000 0100(二进制)
22 03 04 cc cc(十六进制)(后面的没开辟,不用管)

位段不跨平台性

  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。

16位机器最大16,32位机器最大32,当写成27个bit位时,在16位机 器会出问题。

  1. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  2. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的

位段的应用

在这里插入图片描述

我们在网络上传输信息的时候,需要先将信息进行封装,
上图解释了需要封装进哪些信息,如果使用位段就能很好的存储进每个数据,如果不用位段,那数据包大小就会很大(现阶段,了解即可)

结语

位段的介绍和学习到这里就结束了
下篇文章我们会学习自定义类型中的枚举和共用体
我们下篇文章见~

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

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

相关文章

实战:JVM调优命令工具

1、查看堆内存每个对象的信息 jmap -histo 12719 输出文件 jmap -histo 12719 > ./log.txt num: 序号 instances: 实例个数 bytes: 占用空间大小 class name: 类名称 2、查看堆内存信息 jmap -heap 12719 Heap Configuration: 分配的内存空间大小 Heap Usage: 使用的堆内存…

第二届人工智能与智能信息处理技术国际学术会议(AIIIP 2023)

第二届人工智能与智能信息处理技术国际学术会议(AIIIP 2023) 2023 2nd International Conference on Artificial Intelligence and Intelligent Information Processing 第二届人工智能与智能信息处理技术国际学术会议(AIIIP 2023&#xf…

新闻稿写作与校对:爱校对如何确保信息准确无误?

新闻产业一直以其快节奏和时效性为标志。每一篇新闻稿件都需要在第一时间发布,但在这种快速的环境下,如何确保内容不仅快速,而且准确呢?这就是“爱校对”发挥作用的地方,它为新闻机构和记者提供了一种简单、高效的方法…

【音视频】语音对讲之 平台到设备

目录 反向语音流程 2.8-》设备,广播​编辑 设备-》2.8 回复 ​编辑 设备-》2.8 invite sdp​编辑 刚才是19008,我这记录的是19004​编辑 续 【音视频】国标双向对讲方案_wvp 对讲_dualven_in_csdn的博客-CSDN博客 反向语音流程 2.8-》设备,…

湘潭大学 湘大 XTU OJ 1215 A+B V 题解(非常详细)

链接 AB V 题面 题目描述 小明很喜欢做ab,他但经常忘记进位,所以他算881290,而不是100。 现在你给了小明一些ab的算式,请问他算出来会是什么? 输入 第一行是一个整数K,表示样例的个数。 每个样例占一行&#xff…

通信原理板块——基础知识(二)

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 在上一章节介绍了信号,…

YOLO目标检测——磁瓦缺陷数据集下载分享

磁瓦是一种常见的建筑材料,用于地板、墙壁等表面装饰,磁瓦缺陷数据集是用于研究和分析磁瓦缺陷检测问题的数据集。 数据集点击下载:YOLO磁瓦缺陷数据集2700图片6类别.rar

FastReport 群组未连接至数据库

当FastReport 出现群组未连接至数据库 的报错时,可能是GroupHeader的位置不对,如下图,往上拖一下即可。 然后就可以打印出分组的样式了:

怎样理解三次握手和四次挥手?

1. 三次握手 三次握手的大致流程图如下所示 (1)当客户端想与服务端建立连接时,客户端会先发送连接请求到服务端,该请求需要服务器接收并确认,这是一次握手; (2)当服务端收到了客户…

太残忍了,程序员造囚禁被拔牙,全身损伤 88%

周末的时候,看到一条值得大家警惕和警醒的新闻。 据九派新闻报道,中国一男子因未编写出赌博游戏程序,在越南遭到数月的囚禁、虐待。报道称,46 岁的受害人房立敬是一名程序员,由于在中国做生意遇到困难,于 2…

RFID工业识别技术在智能仓储管理中的创新实践

随着信息技术的飞速发展,智能仓储管理已然成为现代物流行业的核心趋势。在这一变革的背景下,RFID工业识别技术崭露头角,为仓储管理注入了创新动力。本文将深入探讨RFID在智能仓库自动化、盘点与分拣中的应用,以及如何解决传统仓储…

你知道fastjson的反序列化漏洞吗?

面试回答 当我们使用 fastjson 进行序列化的时候,当一个类中包含了一个接口(或抽象类)的时候,会将子类型抹去,只保留(抽象类)的类型,使得反序列化时无法拿到原始类型。 那么为了解决…

Redis 5环境搭建

一、环境搭建 如果是Centos8,yum 仓库中默认的 Redis版本就是5,直接yum install即可。如果是Centos7,yum 仓库中默认的 Redis版本是3系列,比较老~ 为了我们能在 Centos7中下载到 Redis5 首先要安装额外的软件源 sudo yum insta…

5G与4G的RRC协议之异同

什么是无线资源控制(RRC)? 我们知道,在移动通信中,无线资源管理是非常重要的一个环节,首先介绍一下什么是无线资源控制(RRC)。 手机和网络通过无线信道相互通信,彼此交…

战略是设计和孕育出来的?跟孙子兵法很类似

战略设计派:战略是设计和孕育出来的【安志强趣讲264期】 设计派起源于西方1957年 很类似《孙子兵法》的观点 趣讲大白话:战略是谋划出来的 **************************** 设计派是战略管理最先出现的流派 到现在还有影响力 非常有名的SWOT是标志 SWOT现在…

Linux之libreoffice安装

一、libreoffice简介 LibreOffice 是一款开放源代码的自由免费全能办公软件,可运行于 Microsoft Windows, GNU/Linux 以及 macOS 等操作系统上。它包含了 Writer, Calc, Impress, Draw, Math 以及 Base 等组件,可分别用于文本文档、电子表格、幻灯片演示…

直播平台源码搭建协议讲解篇:传输控制协议TCP

简介: 由于直播平台在当今时代发展的越来越迅速,使得直播平台的技术功能越来越智能,让用户在直播平台中能够和其他用户进行实时互动,让用户可以获取到全世界最新的资讯,让一些用户可以作为主播获得工作,让…

第六章:红黑树

系列文章目录 文章目录 系列文章目录前言1、红黑树的介绍1. 红黑树的概念1.2 红黑树的性质 2、红黑树的节点的定义3、红黑树的插入(看叔叔的颜色就行)3.1 情况一:uncle存在且为红3.2 情况二:uncle不存在/存在且为黑(直…

Django基础1——项目实现流程

文章目录 一、前提了解二、准备开发环境2.1 创建项目2.1.1 pycharm创建2.1.2 命令创建 2.2 创建应用 例1:效果实现例2:网页展示日志文件 一、前提了解 基本了解: 官网Django是Python的一个主流Web框架,提供一站式解决方案&#xf…

Android Studio中引入MagicIndicator

1.github中下载文件 GitHub - hackware1993/MagicIndicator: A powerful, customizable and extensible ViewPager indicator framework. As the best alternative of ViewPagerIndicator, TabLayout and PagerSlidingTabStrip —— 强大、可定制、易扩展的 ViewPager 指示器框…