结构体实现位段

news/2024/11/8 14:49:24/

一.什么是位段

位段的声明和结构是类似的,有两个不同:
位段的成员必须是 intunsigned int signed int ,在C99中位段成员的类型也可以 选择其他类型。 位段的成员名后边有⼀个冒号和⼀个数字
struct A
{int a : 5;int b : 4;int c : 20;int d : 32;//数字必须<=32
};
位段A所占内存的⼤⼩是多少?
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct A
{int a : 5;int b : 4;int c : 20;int d : 32;//数字必须<=32
};
int main()
{printf("%zd\n", sizeof(struct A));return 0;
}

二.位段的内存分配

位段的空间上是按照需要以4个字节( int )或者1个字节( char )的⽅式来开辟的,段涉及很多不确定因素,位段是不跨平台的,注重可移植的程序应该避免使⽤位段
#define _CRT_SECURE_NO_WARNINGS 1
#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("%zd\n", sizeof(struct S));return 0;
}
其空间是如何开辟的呢?

三.位段的跨平台问题

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

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

四.位段的应⽤

⽹络协议中,IP数据报的格式,我们可以看到其中很多的属性只需要⼏个bit位就能描述,这⾥
使⽤位段,能够实现想要的效果,也节省了空间,这样⽹络传输的数据报⼤⼩也会较⼩⼀些,对⽹络的畅通是有帮助的。

这个就可以通过位段来实现,我们可以将相同的所需用位段来表示,如下:

struct SS
{char a:4;char b:4;char c:8;char d:16;
};

五.位段使⽤的注意事项

位段的⼏个成员共用同⼀个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位置处是没有地址的。内存中每个字节分配⼀个地址,⼀个字节内部的bit位是没有地址的。
所以不能对位段的成员使⽤&操作符,这样就不能使⽤scanf直接给位段的成员输⼊值,只能是先输⼊放在⼀个变量中,然后赋值给位段的成员

例题:
 

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
struct A
{int a : 2;int b : 5;int c : 10;int d : 30;
};
int main()
{struct A a = { 0 };//scanf("%d", &sa._b);这是错误的//正确的⽰范int m = 0;scanf("%d", &m);a.b = m;printf("%d\n", a.b);return 0;
}

最后,学习加油!!!


http://www.ppmy.cn/news/1255071.html

相关文章

数组循环左移

#include <stdio.h> int main() { int n 0; int m 0; int i 0; int k 0; int z 0; int arr[120] { 0 };防止数组越界 scanf("%d %d",&n,&m); for( i 0 ; i < n ; i ) { scanf("%d",&…

网络安全应该怎么学?(0基础小白)

一、网络安全应该怎么学&#xff1f; 1.计算机基础需要过关 这一步跟网安关系暂时不大&#xff0c;是进入it行业每个人都必须掌握的基础能力。 计算机网络计算机操作系统算法与数据架构数据库 Tips:不用非要钻研至非常精通&#xff0c;可以与学习其他课程同步进行。 2.渗透技…

三个写法统计整数前导0个数

从键盘输入一个整数(可能有前导0)&#xff0c;编程统计其前导0个数&#xff0c;其法有三。 (笔记模板由python脚本于2023年12月03日 12:32:32创建&#xff0c;本篇笔记适合对python整型int和字符型str熟悉的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;http…

函数式接口的妙用,让异步执行更简单

你是否曾经遇到过在SpringBoot中Async注解无法正常工作的问题&#xff1f;今天&#xff0c;我们用函数式接口来解决这个问题。 一、什么是函数式接口&#xff1f; 函数式接口&#xff08;Functional Interface&#xff09;是 Java 8 中引入的一个概念&#xff0c;是指只包含一…

【大模型】更强的 ChatGLM3-6B 来了,开源可商用

【大模型】更强的 ChatGLM3-6B 来了&#xff0c;开源可商用 简介ChatGLM3-6B 环境配置环境搭建安装依赖 代码及模型权重拉取拉取 ChatGLM3-6B拉取 ChatGLM3-6B 模型权重及代码 终端测试网页测试安装 gradio加载模型并启动服务 参考 简介 ChatGLM3-6B ChatGLM3-6B 是 ChatGLM …

LeetCode每日一题 | LeetCode-1094.拼车

LeetCode-1094.拼车 题目描述问题分析程序代码 题目描述 原题链接 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组 trips , trip[i] [numPassengersi, fromi, toi] 表…

springcloud==ribbon

单独使用ribbon 建立两个服务端&#xff0c;分别是8080和8081 建立客户端 代码 package org.example.ribbon;import com.netflix.client.ClientFactory; import com.netflix.client.http.HttpRequest; import com.netflix.client.http.HttpResponse; import com.netflix.conf…

宝塔+docker+jenkins部署vue项目----笔记版

宝塔dockerjenkins部署vue项目&#xff08;保姆级教程&#xff09;https://blog.csdn.net/weixin_47284756/article/details/129339940 基于上述教程&#xff0c;不同的地方。 1.我使用的是gitee&#xff0c;所以需要在jenkins中安装gitee插件 配置gitee&#xff0c;其他默认配…