【C语言学习笔记 --- 位段】

C语言程序设计笔记---028

C语言之位段

前言:

通过C语言自定义类型的知识,这篇将对位段,进行深入学习底层原理的知识。

/知识点汇总/

1、介绍位段

基本定义:位段的出现就是为了节省(内存)空间,表述结构体实现位段的能力,位段的位指的是,二进制位

1.1、位段的声明和结构体

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

1.位段的成员必须是:int、unsigned int、signed int(另外,C99之后也可以是其它类型,但普遍都为char/int类型系列)

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

c 复制代码
#include <stdio.h>
//结构体
struct A1
{
	int _a;
	int _b;
	int _c;
	int _d;
};
//位段
struct A2
{
	int _a : 2; //:2指的是_a变量占用2个bit位的空间
	int _b : 5; //:2指的是_b变量占用5个bit位的空间
	int _c : 10;//:2指的是_c变量占用10个bit位的空间
	int _d : 30;//:2指的是_d变量占用30个bit位的空间
	//指定变量一个合适的存储空间,避免过多的浪费
};
int main()
{
	printf("%d\n", sizeof(struct A1));//16
	printf("%d\n", sizeof(struct A2));//8
	//精确到bit位,节省空间
	return 0;
}

那么到底位段是如何指定分配的呢? 答:按bit位划分

1.2、位段的内存分配

(1).位段成员可以是int、unsigned int、signed int或者char类型(char属于整型家族)

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

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

(因为C语言标准并未规定使用bit位的方向,或者一次读取的32bit,是否放下最后的bit位都是不确定的)但即使有再多的不确定性,仍然具备探究的意义

c 复制代码
#include <stdio.h>
//位段
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("%d\n", sizeof(struct S));//3byte
	//小端存储:01100010 00000011 00000100
	//十六进制:6   2    0   3    0   4 --- 0x62 03 04
	//所以发现当前的编译器环境下,使用从低位项高位使用的,
	//同时,当剩余空间不够下一个成员变量使用时,采用的浪费空间bit位的方式存储的。
	return 0;
}

小结 :

1.随意使用位段指定结构体成员的存储的二进制位可能会造成数据丢失

2.发现当前的编译器环境下,使用从低位项高位使用的,同时,当剩余空间不够下一个成员变量使用时,采用的浪费空间bit位的方式存储的。

1.3、位段的跨平台问题

(1).int位段被当成符号数还是无符号数是不确定的

(2).位段中最大位的数目不能确定。(16位机器最大16,32位机器最大32,写成27,在16位机器上就会出问题)(在16位的机器上,整型的大小为两个字节16bit位;在32位的机器上,整型的大小为四个字节32bit位)(所以位段指明所占用的空间大小需要小于等于当时环境的最大bit位)

(3).位段中成员在内存中从左向右分配,还是从右向左分配,C标准尚未定义

(4).当一个结构体包含两个位段,第二个位段成员比较大,无法容纳于第一个位段剩余的位时,是舍弃还是利用剩余位,也是不确定的

1.4、位段的应用

(1).常用于网络的底层空间分配配置

(2).降低网络通道的负载,提升网络的运行效率

(3).网络协议栈节约空间

2、结语

跟结构体相比,位段可以达到同样的效果,并且可以很好的合理利用起来节省空间资源,但是有跨平台(编译器环境等)的问题存在。
半亩方糖一鉴开,天光云影共徘徊。
问渠哪得清如许?为有源头活水来。--朱熹(观书有感)

相关推荐
wuyk5554 小时前
Keil工具链-第05讲-启动文件与__main到底做了什么
c语言·stm32·单片机·嵌入式硬件·物联网
La Pulga8 小时前
【FreeRTOS源码学习笔记】任务延时列表
笔记·mcu·学习·嵌入式·freertos·实时操作系统
楚山之石9 小时前
【JCO】mpMRI 先行替代 TURBT 初始分期:BladderPath 随机试验让 MIBC 患者提前 45 天得到正确治疗
人工智能·学习·mri·医学影像
Navigator_Z12 小时前
LeetCode //C - 1317. Convert Integer to the Sum of Two No-Zero Integers
c语言·算法·leetcode
Peter-OK13 小时前
PostgreSQL学习笔记(入门-进阶-精通说明)
笔记·学习·postgresql
承渊政道13 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
冻柠檬飞冰走茶14 小时前
字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)
c语言·开发语言·数据结构·算法·动态规划
橙橙笔记14 小时前
具身智能的学习 - 完成一个机械臂 第1节
python·学习·机械臂·具身智能
成都蜀味缘餐饮技术培训学校15 小时前
手撕烤兔技术培训实战指南,秘制腌料配方比例与调制手法
大数据·经验分享·笔记·其他·微信公众平台
希和202716 小时前
免费AI视频生成工具汇总(国内优先,适合做漫剧、短视频,Obsidian笔记版)
人工智能·笔记·音视频