C语言之位段(详解)

news2025/2/27 8:48:34

C语言之位段

文章目录

  • C语言之位段
    • 1. 位段的介绍
    • 2. 位段的内存分配
    • 3. 位段跨平台问题
    • 4. 位段的应用
    • 5. 位段使用注意

1. 位段的介绍

位段(bit-field)是C语言中的一种特殊数据类型,它允许将一个字节分成几个部分,并为每个部分指定特定的位数,以便在内存中存储和访问这些部分。

其中位段相较于结构体有两特殊点

  1. 位段的成员必须是 int unsigned intsigned int char(整型家族) ,在C99中位段的成员也可以是其他类型
  2. 位段的成员名后跟一个冒号和数字

例如:

struct A
{
	int a : 5;
	signed int b : 6;
	unsigned int c : 10;
	//int d : 40; 超出了int类型最大的大小
};

数字的含义:表示占多少bit位的大小,且设置的大小不能超过原类型最大的大小,例如int4 字节,设置的数字就不能超过 32 bit

2. 位段的内存分配

  • 1.位段的成员可以是int unsigned int signed int 或者是 char 等类型

  • 2.位段的空间上是按照需要以4个字节( int )或者1个字节( char )的⽅式来开辟的

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

例子:

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;
	printf("%zd", sizeof(s));
	return 0;
}

代码运行结果:>
3

在VS2022中,位段中的成员是从右向左分配空间的,如果遇到不足位段成员大小的空间,则直接丢弃,在开辟一个字节的空间分配

在这里插入图片描述
在内存中
在这里插入图片描述
第一个字节为 0110 0010 转为十六进制为 62
第二个字节为 0000 0011 转为十六进制为 03
第三个字节为 0000 0100 转为十六进制为 04

3. 位段跨平台问题

  1. int 位段被当成有符号数还是⽆符号数是不确定的。
  2. 位段中最⼤位的数⽬不能确定。(16位机器最⼤16,32位机器最⼤32,写成27,在16位机器会出问题。
  3. 位段中的成员在内存中从左向右分配,还是从右向左分配标准尚未定义。
  4. 当⼀个结构包含两个位段,第⼆个位段成员⽐较⼤,⽆法容纳于第⼀个位段剩余的位时,是舍弃剩余的位还是利⽤,这是不确定的。

在C语言中规定,int类型的有无符号是由编译器决定的,但它必须至少能存下-32767~32767的值

int类型在16位机器上是2个字节的,这是你位段分配了超过16bit时就会有问题

位段内存分配没有明确规定,取决于编译器,不同编译器实现的方式不同。在VS2022中,位段成员是从右往左分配内存的,并且如果遇到一个字节中的内存不够时,则会抛弃剩余内存,重新开辟一个字节的内存再分配

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

4. 位段的应用

一下是IP数据报的格式图
在这里插入图片描述
在上述图片中可以看到,有些数据只需几bit的内存空间,位段允许几个数据类型合并在一起,节约了存储内存,⽹络传输的数据报⼤⼩也会较⼩⼀些,对⽹络的畅通是有帮助的

5. 位段使用注意

位段允许几个小的数据类型合并在一起,这样有的成员的起始位置就不是某个字节的起始位置,在内存中为每个字节分配一个地址,一个字节内部的 bit位 是没有地址

TIPS:不能对位段中的某个成员使用&操作符

既然不能使用&操作符,那么怎么对位段中的成员赋值呢
可以值存入一个变量中,再将变量的值赋给位段中的成员

#include <stdio.h>

struct S
{
	char a : 5;
	int b : 16;
};
int main()
{
	struct S s = { 0 };
	//scanf("%d", &s.a); 这是错误的

	//正确示范
	int n = 0;
	scanf("%d", &n);
	s.a = n;
	return 0;
}

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

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

相关文章

设计模式-结构型模式之组合、享元设计模式

文章目录 四、组合模式五、享元模式 四、组合模式 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。 组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。它创建了…

嵌入式Linux:ARM驱动+QT应用+OpenCV人脸识别项目实现

一、前言&#xff1a; 这个项目主要分为两部分&#xff0c;客户端&#xff08;ARM板端&#xff09;负责利用OpenCV采集人脸数据&#xff0c;利用TCP将人脸数据发送给服务器&#xff0c;然后服务器根据人脸数据进行人脸识别&#xff0c;将识别后的结果返还给客户端&#xff0c;客…

【教学类-06-13】20231202 0-9数字分合-房屋样式(二)-左空或者右空-升序-抽7题

作品展示&#xff1a; 背景需求&#xff1a; 【教学类-06-12】20231202 0-9数字分合-房屋样式&#xff08;一&#xff09;-下右空-升序-抽7题-CSDN博客文章浏览阅读102次。【教学类-06-12】20231202 0-9数字分合-房屋样式-下右空-升序https://blog.csdn.net/reasonsummer/arti…

Redis数据存储:高效、灵活、实时

目录 引言 1. Redis概述 1.1 什么是Redis&#xff1f; 1.2 Redis的数据结构 1.3 Redis的持久化机制 2. Redis的使用场景 2.1 缓存 2.2 会话存储 2.3 发布/订阅系统 2.4 计数器和排行榜 3. Redis最佳实践 3.1 数据模型设计 3.2 键的命名规范 3.3 事务和原子操作 3…

windows11 hosts文件没权限修改

1 win➕R 2 输入 cmd 3 同时按三个键 ctrl➕shift➕enter打开管理员权限 4 输入notepad回车,在记事本里直接点击文件-打开&#xff0c;选择路径:C:\Windows\System32\drivers\etc&#xff0c;继续选择所有文件&#xff0c;然后打开hosts文件 5 修改完之后&#xff0c;c…

九九乘法表-第11届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第13讲。 九九乘法表&#…

SickOs1.2

信息收集 # Nmap 7.94 scan initiated Wed Nov 22 22:16:22 2023 as: nmap -sn -oN live.nmap 192.168.182.0/24 Nmap scan report for 192.168.182.1 (192.168.182.1) Host is up (0.00028s latency). MAC Address: 00:50:56:C0:00:08 (VMware) Nmap scan report for 192.168…

04-配置远程仓库的SSH免密登陆

配置SSH免密登录 配置步骤 创建好的远程仓库也可以使用SSH的方式进行访问,但如果没有配置公钥会有警告 第一步: 删除用户家目录下的.ssh目录,如果没有该目录或者该目录下已经有密钥了就不用执行该操作 #进入当前用户的家目录,删除.ssh 目录 LayneLAPTOP-Layne MINGW64 ~ $ r…

hexo博客部署到云服务器

欢迎大家到我的博客浏览。hexo博客部署到云服务器 | YinKais Blog 这篇文章带大家将hexo博客部署到云服务器上&#xff01; 一、服务器环境安装 1、安装 node js yum install gcc-c make yum -y install nodejs yum -y install npm 验证 node -v npm -v 2、安装git、ngin…

基于SSM的网上书城

简介 本系统主要分为前台和后台&#xff0c;前台网页主要是面向用户的&#xff0c;用户注册登录后网上书城可以进行下单购买图书&#xff0c;主要功能有图书基本信息的查询、用户登录和注册、图书搜索、添加购物车、购买、订单查询等功能&#xff0c;后台是管理员进入的&#x…

Spring-SpringFramework特性以及IOC相关知识

SpringFramework五大模块 特性 IOC思想和DI IOC是容器&#xff0c;用于管理资源 IOC&#xff1a;Inversion of Control 反转控制 DI&#xff1a;Dependecy Injection 依赖注入 组件以预先定义好的方式接受来自容器的资源注入 IOC在Spring中的实现 spring提供两种方式&…

网上商城、宠物商城源码(Java)

javaWebjsp网上书城以及宠物商城源码&#xff0c;功能有购物车、收藏以及下单等等功能 带后台管理功能 运行示意图&#xff1a;

我爱上这38个酷炫的数据大屏(附 Python 源码)

随着大数据的发展&#xff0c;可视化大屏在各行各业得到越来越广泛的应用。 可视化大屏不再只是电影里奇幻的画面&#xff0c;而是被实实在在地应用在政府、商业、金融、制造等各个行业的业务场景中&#xff0c;切切实实地实现着大数据的价值。 所以本着学习的态度&#xff0…

【算法通关村】链表基础经典问题解析

【算法通关村】链表基础&经典问题解析 一.什么是链表 链表是一种通过指针将多个节点串联在一起的线性结构&#xff0c;每一个节点&#xff08;结点&#xff09;都由两部分组成&#xff0c;一个是数据域&#xff08;用来存储数据&#xff09;&#xff0c;一个是指针域&…

软件工程 - 第8章 面向对象建模 - 4 - 物理体系结构建模

构件图 构件图概述 构件图描述了软件的各种构件和它们之间的依赖关系。 构件图的作用 在构件图中&#xff0c;系统中的每个物理构件都使用构件符号来表示&#xff0c;通常&#xff0c;构件图看起来像是构件图标的集合&#xff0c;这些图标代表系统中的物理部件&#xff0c;…

前端监控学习笔记

现成的SDK SentryFun Debug 需要监控什么&#xff1f; 错误统计 记录我们代码发布到线上各种奇奇怪怪的错误 行为日志埋点 记录用户行为&#xff0c;比如&#xff1a;分析用户浏览时间比较长的页面有哪些&#xff0c;常常点击的有哪些&#xff0c;可以做 相应的推荐 PV/UV统…

管理类联考-性质

性质 ——性质—— 一、是什么 &#xff08;1&#xff09;本质&#xff1a;判断一定范围内的对象是否具备某个性质的命题就是性质命题&#xff08;直言命题&#xff09;。直言命题是断定事物/对象是否具有某种性质的命题。直言命题在结构上由主项、谓项、联项和量项组成。 &am…

【ArcGIS Pro微课1000例】0039:制作全球任意经纬网的两种方式

本文讲解在ArcGIS Pro中制作全球任意经纬网的两种方式。 文章目录 一、生成全球经纬网矢量1. 新建地图加载数据2. 创建经纬网矢量数据二、布局生成经纬网1. 新建布局2. 创建地图框2. 创建经纬网一、生成全球经纬网矢量 以1:100万比例尺地图分幅为例,创建经差6、维差4的经纬网…

<软考>软件设计师-1计算机组成与结构(总结)

(一)计算机系统基础知识 1 计算机硬件组成 计算机的基本硬件系统由运算器、控制器、存储器、输入设备 和 输出设备 5大部件组成。 1 运算器、控制器等部件被集成在一起统称为中央处理单元(CPU) 。CPU是硬件系统的核心&#xff0c;用于数据的加工处理&#xff0c;能完成各种算…

gitlab高级功能之容器镜像仓库

今天给大家介绍一个gitlab的高级功能 - Container Registry&#xff0c;该功能可以实现docker镜像的仓库功能&#xff0c;将gitlab上的代码仓的代码通过docker构建后并推入到容器仓库中&#xff0c;好处就是无需再额外部署一套docker仓库。 文章目录 1. 参考文档2. Container R…