【C语言】位段详解

简介: 【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. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是 舍弃剩余的位还是利用,这是不确定的

位段的应用

我们在网络上传输信息的时候,需要先将信息进行封装,

上图解释了需要封装进哪些信息,如果使用位段就能很好的存储进每个数据,如果不用位段,那数据包大小就会很大(现阶段,了解即可)

结语

位段的介绍和学习到这里就结束了

下篇文章我们会学习自定义类型中的枚举和共用体

我们下篇文章见~


相关文章
|
Ubuntu Linux Android开发
WireGuard 系列文章(三):WireGuard 安装
WireGuard 系列文章(三):WireGuard 安装
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:一场永无止境的较量
【10月更文挑战第3天】 本文旨在深入剖析安卓 (Android) 和iOS两大移动操作系统在安全性方面的显著差异,通过细致对比,揭示它们在隐私保护、数据加密、应用生态监管以及系统更新机制等关键领域的不同策略与实践。文章不仅从技术层面探讨了两者的设计理念差异,还结合了实际案例分析,展示了这些差异如何影响用户体验和数据安全。最终,旨在为读者提供一个全面的视角,理解在日益复杂的数字环境中,选择何种移动平台可能更符合其对安全性和隐私保护的需求。
|
12月前
|
机器学习/深度学习 人工智能 自然语言处理
AI在自然语言处理中的突破:从理论到应用
AI在自然语言处理中的突破:从理论到应用
704 17
|
网络架构
Ensp dhcp全局地址池(配置命令 + 实例)
Ensp dhcp全局地址池(配置命令 + 实例)
1228 1
|
安全 数据安全/隐私保护
浏览器如何验证数字证书
【11月更文挑战第2天】本文介绍了数字证书的申请流程及其在HTTPS中的应用。首先,申请者需向CA机构提交包含公钥等信息的表单,经审核后,CA机构使用私钥生成数字签名并返回证书。接着,文章详细描述了浏览器验证证书的过程,包括检查有效期、吊销状态及CA机构的合法性。最后,解释了根CA与中间CA的概念,以及如何通过证书链验证证书的合法性。
|
存储 编解码 UED
网站图片JPG、PNG、GIF哪个好,该选择谁
网站图片JPG、PNG、GIF哪个好,该选择谁
683 0
|
存储 机器学习/深度学习 缓存
一文弄懂Python字典的使用
Python是一门广泛应用于数据分析、机器学习等领域的语言,而字典作为Python中最常用的数据类型之一,也被广泛使用。本文将详细介绍Python字典的相关知识点,包括字典的基础用法、高级用法、原理、优缺点、性能评估、使用场景、小技巧等等。
334 4
|
传感器 JavaScript 前端开发
VSCOde安装node.js环境
VSCOde安装node.js环境
|
Kubernetes 网络协议 Dubbo
《Nacos 架构与原理》| Nacos社区首本电子书免费下载
《Nacos 架构与原理》是 Nacos 电子书系列计划的第一步,并且这部分内容希望和社区共同创作,社区会推动 Nacos 电子书持续更新迭代,也欢迎更多小伙伴能加入 Nacos 社区一起创作。我们把电子书文档通过语雀公开文档像社区开放评论和更新,希望大家针对于内容共同进行校对,并且也欢迎进行投稿,把经验向社区更多个人和企业进行分享。
2900 95
《Nacos 架构与原理》| Nacos社区首本电子书免费下载
|
小程序 开发者
微信小程序使用vant组件所出现的一些问题
微信小程序使用vant组件所出现的一些问题
470 0