【C语言】位段详解

前言

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

位段

位:指的是二进制位

位段的声明

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

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.mzph.cn/news/47932.shtml

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

相关文章

【雷达】接收和去噪L波段雷达接收到的信号研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Linux 多线程中执行fork的情况

一、普通多线程中执行fork的情况 1.多线程中没有执行fork的情况 代码如下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<pthread.h> #include<string.h> #include<semaphore.h>void*fun(void* arg) …

4.物联网LWIP之C/S编程,实现服务器大小写转换

LWIP配置 服务器端实现 客户端实现 错误分析 一。LWIP配置&#xff08;FREERTOS配置&#xff0c;ETH配置&#xff0c;LWIP配置&#xff09; 1.FREERTOS配置 为什么要修改定时源为Tim1&#xff1f;不用systick&#xff1f; 原因&#xff1a;HAL库与FREERTOS都需要使用systi…

信号处理--基于EEG脑电信号的眼睛状态的分析

本实验为生物信息学专题设计小项目。项目目的是通过提供的14导联EEG 脑电信号&#xff0c;实现对于人体睁眼和闭眼两个状态的数据分类分析。每个脑电信号的时长大约为117秒。 目录 加载相关的库函数 读取脑电信号数据并查看数据的属性 绘制脑电多通道连接矩阵 绘制两类数据…

Nacos

Nacos介绍 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的⾸字⺟简称&#xff0c;⼀个更易于构 建云原⽣应⽤的动态服务发现、配置管理和服务管理平台。 在这个介绍中&#xff0c;可以看出Nacos⾄少有三个核⼼功能&#xff1a; 1. 动态服务发现 2. 配…

神经网络为什么可以学习

本资料转载于B站up主&#xff1a;大模型成长之路,仅用于学习和讨论&#xff0c;如有侵权请联系 动画解析神经网络为什么可以学习_哔哩哔哩_bilibilis 1、一个神经网络是由很多神经元形成的 1.1 也可以是一层&#xff0c;也可以是多层 2 层和层之间的连接就跟一张网一样 2.1 每…

【ppt密码】为什么PPT幻灯片不能编辑?

PPT打开之后&#xff0c;发现幻灯片内不能编辑&#xff0c;出现这种情况的原因大概有两个。 原因一&#xff1a;幻灯片母版 当幻灯片中出现有些固定的对象无法修改、无法编辑的时候&#xff0c;很有可能就是因为在母版视图中进行了设置。我们只需要再打开幻灯片母版&#xff…

适用于Android™的Windows子系统Windows Subsystem fo r Android™Win11安装指南

文章目录 一、需求二、Windows Subsystem for Android™Win11简介三、安装教程1.查看BIOS是否开启虚拟化2.安装Hyper-V、虚拟机平台3.启动虚拟机管理程序(可选)4.安装适用于Android™的Windows子系统5.相关设置 一、需求 需要在电脑上进行网课APP&#xff08;无客户端只有App&…

Java入门级基础教学(史上最详细的整合)

目录 一&#xff1a;基础语法 1.“Hello word” 2.Java的运行机制 3. Java基本语法 1.注释、标识符、关键字 2.数据类型&#xff08;四类八种&#xff09; 4.类型转换 1.自动转换 2.强制转换 5.常量和变量 1.常量 2.变量 3.变量的作用域 6.运算符 1.算数运算符 …

2023/8/16 华为云OCR识别驾驶证、行驶证

目录 一、 注册华为云账号开通识别驾驶证、行驶证服务 二、编写配置文件 2.1、配置秘钥 2.2、 编写配置工具类 三、接口测试 3.1、测试接口 3.2、结果 四、实际工作中遇到的问题 4.1、前端传值问题 4.2、后端获取数据问题 4.3、使用openfeign调用接口报错 4.3、前端显示问题…

电力虚拟仿真 | 高压电气试验VR教学系统

在科技进步的推动下&#xff0c;我们的教育方式也在发生着翻天覆地的变化。其中&#xff0c;虚拟现实&#xff08;VR&#xff09;技术的出现&#xff0c;为我们提供了一种全新的、富有沉浸感的学习和培训方式。特别是在电力行业领域&#xff0c;例如&#xff0c;电力系统的维护…

ssm+vue绿色农产品推广应用网站源码和论文PPT

ssmvue绿色农产品推广应用网站041 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高…

第3步---MySQL的DDL和DML操作

第3步---MySQL的DDL和DML操作 1.DDL操作 Data Defination Language 数据定义语言。创建数据库和表的不涉及到数据的操作。 1.1DDL基本操作 1.1.1数据库相关操作 ddl&#xff1a;创建数据库&#xff0c;创建和修改表 对数据库常见的操作&#xff1a; 操作数据库 -- 展示数据…

PSP - 基于开源框架 OpenFold Multimer 蛋白质复合物的结构预测与BugFix

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132410296 AlphaFold2-Multimer 是一个基于 AlphaFold2 的神经网络模型&#xff0c;可以预测多链蛋白复合物的结构。该模型在训练和推理时都可以处…

微信小程序卡片横向滚动竖图

滚动并不是使用swiper&#xff0c;该方式使用的是scroll-view实现 Swiper局限性太多了&#xff0c;对竖图并不合适 从左往右滚动图片示例 wxml代码&#xff1a; <view class"img-x" style"margin-top: 10px;"><view style"margin: 20rpx;…

【SpringCloud】Gateway使用

文章目录 概述阻塞式处理模型和非阻塞处理模型概念阻塞式处理模型 三大核心概念 工作流程使用POMYML启动类配置路由通过编码进行配置动态路由常用的Route Predicate自定义全局过滤器自定义filter 官网 https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.1…

Leetcode61 旋转链表

给你一个链表的头节点 head &#xff0c;旋转链表&#xff0c;将链表每个节点向右移动 k 个位置。 示例1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k 2 输出&#xff1a;[4,5,1,2,3] 示例2&#xff1a; 输入&#xff1a;head [0,1,2], k 4 输出&#xff1a;[2,0,1] …

软考高级系统架构设计师(一)计算机硬件

【原文链接】软考高级系统架构设计师&#xff08;一&#xff09;计算机硬件 1.1 计算机硬件组成 1.1.1 计算机的基本硬件组成 运算器控制器存储器输入设备输出设备 1.1.2 中央处理单元&#xff08;CPU&#xff09; 中央处理单元&#xff08;CPU&#xff09;的组成 运算器…

7.11 Java方法重写

7.11 Java方法重写 这里首先要确定的是重写跟属性没有关系&#xff0c;重写都是方法的重写&#xff0c;与属性无关 带有关键字Static修饰的方法的重写实例 父类实例 package com.baidu.www.oop.demo05;public class B {public static void test(){System.out.println("这…

实时拍照翻译怎么做?几个步骤轻松翻译

现在&#xff0c;随着人们跨越国界的频率不断增加&#xff0c;语言障碍成为了一个越来越普遍的问题。为了解决这个问题&#xff0c;一些应用程序开始提供实时拍照翻译功能&#xff0c;这种功能可以通过手机摄像头拍摄文本&#xff0c;并将其翻译成用户所需的语言。那么&#xf…