广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言快速掌握位段使用
  • 690
分享到

C语言快速掌握位段使用

2024-04-02 19:04:59 690人浏览 泡泡鱼
摘要

目录一、位段是什么二、位段的内存分配2.1位段内存分配的原则2.2位段内存分配图解三、位段的跨平台问题四、位段的使用总结一、位段是什么 位段的声明和结构是类似的,有两个不同 1.位段

一、位段是什么

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

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

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

举例如下:

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

这个A就是一个位段。

但是结构体可以根据结构体内存对齐确定一个结构体的大小,但是位段的大小怎么确定呢?

位段A的大小是多少呢?

printf("%d\n", sizeof(struct A));

我们利用sizeof操作符来测一下这个A位段的大小是8个字节

但是根据常理来说应该是16个字节呀,我们和结构体对比分析

struct s
{
    int a;
    int b;
    int c;
    int d;
    };
   int main()
   {
     printf("%d\n", sizeof(struct s));//16个字节
     return 0;
     }

对比发现位段不是根据他的数据类型来分配内存的。接下来我们看看位段是怎么分配内存的。

二、位段的内存分配

2.1位段内存分配的原则

  1. 位段的成员可以是 int unsigned int signed int 或者是 char (属于整形家族)类型
  2. 位段的空间上是按照需要以4个字节( int )或者1个字节( char )的方式来开辟的。
  3. 位段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使用位段。ps:虽然位段是不跨平台的,但是我们可以根据平台的不同编写不同的代码
struct A
{
    int _a:2;     //虽然a是int型但是他所分配的内存根据冒号之后的数字确定,a冒号后面是2,所以他只占用2个比特位
    int _b:5;    //同理,b成员只需要5个比特位
    int _c:10;    //10个比特位
    int _d:30;    //30个比特位
    };

  那么我们发现这个字段A一共需要47个比特位,好像6个字节就可以完成存储,但是事实并非如此,我们根据位段的内存分配原则,位段的成员是int类型所以按照需要以4个字节的方式开辟,我们先开辟4个字节的空间,即32个比特位,我们可以存储a,b,c但是存储d的时候发现内存不够了,我们再次按照需求再一次开辟4个字节的空间,最终开辟了8个字节的空间而非6个字节的空间来存储位段A。

  但是a,b,c存储之后还剩下15个比特位,这些比特位还用不用呢?

  答案是不确定的,每个编译器的处理方式都是不一样的,在VS环境下就浪费掉了,位段依旧有很多的不确定性。下面用图例理想表示一下在VS环境下位段的存储:

代码如下:

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
struct S
{
  	char a : 3;    //a占3个比特位,以下同理
  	char b : 4;    
  	char c : 5;
  	char d : 4;
};
int main()
{
//printf("%d\n", sizeof(struct S));
	struct S s = { 0 };
	s.a = 10;       // 赋值给位段的成员
	s.b = 12;
	s.c = 3;
	s.d = 4;
  return 0;
}

2.2位段内存分配图解

假设内存都是由低位向高位使用的,即从右向左使用:

我们将这3个字节的内存中都用0进行初始化:

struct S s = {<!--{C}%3C!%2D%2D%20%2D%2D%3E--> 0 };

三、位段的跨平台问题

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

int的最高位原本是符号位,但是int位段是有符号数还是无符号数是不确定的。位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器会出问题。

(16位机器最大可以处理16位数据,寻址空间也只有16位,但是如果传入27位数据就会出问题)

ps:int在16位操作系统下占2个字节。位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。

上图只是假设我们从右向左使用,但是分配表示尚未定义,所以也是不确定的。当一个结构包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃剩余的位还是利用,这是不确定的。

总结:

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

  牺牲了它的可移植性,但是节省了空间,可以根据需求选择。

  为什么说和结构相比,位段可以节省空间呢?

代码如下(示例):

struct A
{
    int _a:2;     //虽然a是int型但是他所分配的内存根据冒号之后的数字确定,a冒号后面是2,所以他只占用2个比特位
    int _b:5;    //同理,b成员只需要5个比特位
    int _c:10;    //10个比特位
    int _d:30;    //30个比特位
    };

  比如这个代码,假设a的取值只可能是0,1,2,3,如果用结构写的话会给a分配4个字节的空间也就是32个比特位,但是a最大需要的比特位是2位,所以会大大造成浪费,并且结构体还存在结构体内存对齐问题,牺牲了空间提高了时间效率。

四、位段的使用

总结

  位段的介绍到此结束,总结一下就是位段相比较结构体节省了空间但是失去了可移植性,存在了跨平台的问题,我们可以根据自身的需求来选择是否使用位段,同时位段广泛使用在计算机网络方面,如果想变强就需要学会合理使用位段,加油 少年们!

到此这篇关于C语言快速掌握位段使用的文章就介绍到这了,更多相关C语言位段内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言快速掌握位段使用

本文链接: https://www.lsjlt.com/news/168236.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言快速掌握位段使用
    目录一、位段是什么二、位段的内存分配2.1位段内存分配的原则2.2位段内存分配图解三、位段的跨平台问题四、位段的使用总结一、位段是什么 位段的声明和结构是类似的,有两个不同 1.位段...
    99+
    2022-11-13
  • C语言实题讲解快速掌握单链表上
    目录1、移除链表元素2、反转链表3、链表的中间节点4、链表中倒数第k个节点5、合并两个有序链表6、链表分割1、移除链表元素 链接直达: 移除链表元素 题目: 思路: 此题要综合考虑...
    99+
    2022-11-13
  • C语言实题讲解快速掌握单链表下
    目录1、移除链表元素2、反转链表3、链表的中间节点4、链表中倒数第k个节点5、合并两个有序链表6、链表分割1、移除链表元素 链接直达: 移除链表元素 题目:  思路: 此...
    99+
    2022-11-13
  • C语言 单向链表的增删查改快速掌握
    目录前言一、创建二、单向链表的函数声明三、函数实现1.创建节点2.尾插节点3.头插4.尾删5.头删6.查找节点7.修改总结前言 链表是线性表的链式存储结构,它可以以O(1)的时间复杂...
    99+
    2022-11-12
  • 快速掌握Go语言正/反向代理
    先重温一下什么叫反向代理,正向代理。 所谓正向,反向代理取决于代理的是出站请求,还是入站请求。 正向代理: 代理的出站请求, 客户端能感知到代理程序,架构上距离客户端更近。反向代理:...
    99+
    2022-11-13
    go 实现正向代理和反向代理 golang反向代理使用 golang实现正/反向代理
  • 如何快速掌握 Go 语言关键字?
    Go 语言是一种高效、快速、简单的编程语言,它的出现极大地改善了现代编程的生态环境。Go 语言的开发团队为了提高编程效率和代码可读性,设计了一系列的关键字。掌握这些关键字是学习 Go 语言的必要步骤。本篇文章将为大家介绍如何快速掌握 Go...
    99+
    2023-07-28
    关键字 教程 linux
  • 如何快速掌握Go语言的自然语言处理?
    Go语言是一种高效、简洁、并发性强的编程语言,在自然语言处理领域中也得到了广泛的应用。如果您想要快速掌握Go语言的自然语言处理技能,本文将为您提供一些宝贵的建议和技巧。 一、了解自然语言处理的基础知识 在开始学习自然语言处理之前,您需要了解...
    99+
    2023-07-25
    教程 自然语言处理 异步编程
  • 快速掌握Go语言中使用NumPy对象的技巧
    Go语言是一种强类型编程语言,它的语法简单易懂,同时还拥有快速编译和高效运行的特点。在Go语言中,使用NumPy对象可以帮助我们更加高效地进行科学计算和数据分析。本文将介绍如何,并且会穿插一些演示代码。 导入NumPy包 在使用NumP...
    99+
    2023-08-28
    numpy 对象 教程
  • Python如何快速上手? 快速掌握一门新语言的方法
    那么Python如何快速上手?找来了一篇广受好评的新语言学习方法介绍,供大家参考。 听说,你决定要为你的 “技能树” 再添加一门特定的编程语言。那该怎么办呢? 在这篇文章中,作者提出了 12 项关于学习技术...
    99+
    2022-06-04
    快速 一门 上手
  • 快速掌握VueRouter使用方法
    目录一、编程式路由导航二、缓存路由组件三、两个新的声明周期钩子四、路由守卫五、路由器的两种工作模式本篇博客会介绍Vue中的VueRouter的基本使用,编程式路由导航增加了我们进行路...
    99+
    2023-01-09
    Vue Router用法 Vue Router原理
  • “Go语言实时开发技术:如何快速掌握?”
    Go语言是一种相对年轻的编程语言,由于其高效、高并发、易于学习等优点,越来越多的开发者开始使用它来开发各种应用程序。但是,对于初学者来说,Go语言的学习曲线可能比较陡峭,需要一些实时开发技巧来帮助他们快速掌握这门语言。 本文将介绍一些Go语...
    99+
    2023-10-23
    教程 开发技术 实时
  • GO语言学习笔记:如何快速掌握语言的基础知识?
    随着技术的不断发展,越来越多的程序员开始学习GO语言。GO语言是Google于2009年推出的一种编程语言,它的设计目标是提供一种简单、高效、可靠的编程语言。GO语言在性能、并发性和可维护性方面表现出色,因此受到了众多开发者的青睐。本文将...
    99+
    2023-06-28
    学习笔记 教程 开发技术
  • 快速掌握Go语言HTTP标准库的实现方法
    目录HTTP clientClient 结构体初始化请求NewRequest 初始化请求Request准备 http 发送请求Transport获取空闲连接 queueForIdle...
    99+
    2022-11-11
  • GO语言学习笔记:如何快速掌握开发技术?
    GO语言是一种相对较新的编程语言,它吸收了许多其他编程语言的优点,如C语言的速度和Python的简洁性。GO语言的语法简单明了,适合初学者学习。本文将介绍一些学习GO语言的技巧和建议,以帮助你快速掌握开发技术。 一、安装GO语言 首先,你...
    99+
    2023-06-28
    学习笔记 教程 开发技术
  • 一文快速掌握C++双端数组容器deque的使用
    目录deque容器的概念模型deque容器的基本操作构造函数赋值操作容器大小插入和删除数据存取排序deque容器的概念模型 是双端数组,可以对头部进行插入删除操作 示意图 值得注意...
    99+
    2022-11-13
  • 快速掌握Node.js模块封装及使用
    Node.js中也有一些功能的封装,类似C#的类库,封装成模块这样方便使用,安装之后用require()就能引入调用. 一、Node.js模块封装 1.创建一个名为censorify的文件夹 2.在ce...
    99+
    2022-06-04
    模块 快速 Node
  • 彻底掌握C语言strcat函数的用法
    目录1.函数介绍1.1.函数接口1.2.函数分析1.3.函数的简单使用2.库函数strcat源代码库函数分析3.模拟实现 strcat 函数模拟实现总结分析写在后面strcat函数详...
    99+
    2022-11-13
  • 彻底掌握C语言strcpy函数的用法
    目录1.函数介绍1.1.函数接口1.2.函数分析2.库函数strcpy源代码2.1.库函数分析3.模拟实现strcpy函数3.1.模拟实现写在后面strcpy函数详解如下 1.函数介...
    99+
    2022-11-13
  • 快速掌握Go语言中运算符优先级的排序规则
    快速掌握Go语言中运算符优先级的排序规则,需要具体代码示例在Go语言中,运算符的优先级决定了表达式中运算符的执行顺序,这对于正确理解和编写代码非常重要。本文将介绍Go语言中运算符的优先级的排序规则,并提供具体的代码示例,帮助读者更快速地掌握...
    99+
    2023-12-23
    掌握Go运算符优先级
  • 学习Go语言的技巧和方法,快速掌握编程技能
    学习一门编程语言是现代社会中越来越重要的技能之一。Go语言作为一种相对年轻但非常受欢迎的编程语言,它具有简洁、高效和可扩展的特点,因此对于想要提升自己的编程能力的人来说,学习Go语言是一个不错的选择。本文将介绍如何高效学习Go语言,轻松掌握...
    99+
    2023-12-30
    编程技能 Go语言学习 高效学习
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作