当前位置: 首页 > news >正文

【C语言】结构体实现位段!位段有何作用?

本篇文章目录

  • 1. 声明位段
  • 2. 位段的内存分配
  • 3. 位段的跨平台问题
  • 4.位段的应用
  • 5. 如何解决位段的跨平台问题?

1. 声明位段

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

  1. 位段的成员必须是 int、unsigned int 或 char。
  2. 位段的成员名后边有一个冒号和一个数字。
struct A
{int _a:2;int _b:5;int _c:10;int _d:30;
};

2. 位段的内存分配

  1. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  2. 冒号后面的数字代表该成员大小为多少个bit位,是bit位不是字节!千万不要被成员的数据类型给迷惑了,认为int就是分配4个字节。
struct A
{int _a:2; // _a的大小为2个bit位int _b:5; // _b的大小为5个bit位int _c:10; // _c的大小为10个bit位int _d:30; // _d的大小为0个bit位
};

举例如何分配内存空间:在这里插入图片描述

一个个说明:因为每个成员变量只申请个位数的bit位,所以是按1个字节来申请内存空间的。

  1. a只能存储3个bit位大小数据,a = 10(补码为1010),只能存后三位010,从低位开始存,那么这1个字节还剩5个bit位。
  2. b大小为4个bit位,还剩5个bit位能存下b,暂时不用开辟空间。b = 12(补码为1100),4个bit位刚好存下4位,最后这1个字节还剩1个bit位。
  3. c的大小是5个bit位,剩下的1个bit位不够存,这1个bit位就直接不使用了(浪费掉),再开辟1个字节存储c,c = 3(补码为0011),5个bit位能存下00011,还剩3个bit位。
  4. d的大小是4个bit位,剩下的3个bit位不够存(然后浪费掉),再开辟1个字节内存空间存储d。d = 4(补码为0100)1个字节能存下。

总共开辟了3个字节。

3. 位段的跨平台问题

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

  1. int 位段被当成有符号数还是无符号数是不确定的。
  2. 位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,位段成员大小写成27,在16位机器会出问题。)
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的(在vs编译器中的实现是直接舍弃剩余位数)。

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

4.位段的应用

在这里插入图片描述
对于消息的传输,不仅仅只是把发送的消息传输到目的地就完了那么简单。实际上会将消息进行一个打包,其中还包含了很多信息,缺少这些信息是无法传输消息的。比如你的机器ip地址和你要发送的目的地(对方)的ip地址,这两个信息非常重要(当然也不是说其它信息就不重要了,图中任何一点都很重要)。

对于上面这些信息,如果不使用位段来分配,数据就会比较大。对于网络传输数据而言,当然是越小的数据量网络更流畅,就好比现实生活中的马路,大车多了会比较堵塞,要都是小车那么路况就比较畅通。

5. 如何解决位段的跨平台问题?

其实位段的不兼容、不可移植性也不是很可怕。解决的办法就是针对每个不同的机器/平台设计对应的程序即可,唯一的不方便之处应该就是工作量变大了,不过复制粘贴针对性改一改应该没毛病。

http://www.lryc.cn/news/173889.html

相关文章:

  • msvcp140为什么会丢失?msvcp140.dll丢失的解决方法
  • Ingress Controller
  • 离线安装 K3S
  • Error系列-常见异常问题解决方案以及系统指令总结
  • c 各种例子
  • Flowable主要子流程介绍
  • 通过插件去除Kotlin混淆去除 @Metadata标记
  • 【docker】容器跟宿主机、其他容器通信
  • nginx重要配置参数
  • Docker 部署 PostgreSQL 服务
  • 【通信误码】python实现-附ChatGPT解析
  • 人与机器只能感知到可以分类的事物?
  • 2023华为杯数学建模竞赛E题
  • AIX360-CEMExplainer: MNIST Example
  • TouchGFX之自定义控件
  • Python中match...case的用法
  • 深度学习自学笔记二:逻辑回归和梯度下降法
  • 【Element】通知 Notification
  • vue+express、gitee pm2部署轻量服务器(20230923)
  • 前端教程-H5游戏开发
  • Nginx 关闭/屏蔽 PUT、DELETE、OPTIONS 请求
  • 【React】React概念、特点和Jsx基础语法
  • 大数据的崭露头角:数据湖与数据仓库的融合之道
  • 用go实现cors中间件
  • Linux 链表示例 LIST_INIT LIST_INSERT_HEAD
  • 【机器学习】详解回归(Regression)
  • mac 配置 httpd nginx php-fpm 详细记录 已解决
  • Angular 项目升级需要注意什么?
  • 开发高性能知识付费平台:关键技术策略
  • python图像匹配:如何使用Python进行图像匹配