C语言《位段结构体、联合体》
目录
1.什么是位段?
2.位段的意义
3.位段的使用方法
4.位段在内存中的存储形式以及其大小的计算
5.位段的跨平台问题
1.什么是位段?
位段中的位指的是二级制位,故位段结构体指的是以二进制位位单位创建的结构体,他是一种结构体类型,同时联合体也同样适用。而位段的使用范围只有(int,unsigned int ,signed int),其中char也属于特殊的整型,故同样适用。
2.位段的意义
节省空间,结构体成员中以类型定义(char,int,long,double...),但是如果已知所设定的整型的范围,比如星期week(1-7)那么就可定义的范围4个比特位。一定程度上节省空间。
3.位段的使用方法
1.位段的成员可以是 int ,unsigned int, signed int, 以及char(属于整型家族)。
2.位段的空间是由需要按照int(4个字节)以及char(1个字节)的来开辟的。
3.位段有很多不确定因素,位段是不跨平台的,注重对可移植的程序应该避免使用位段。
//举个例子 struct s {int a:2;int b:3;int c:30; }stu;
注意:
若你所分配的内存不够存放你所要存储的数据时就会发生截断。如stu.a = 10; a为2 bit 实际上10的二进制位为1010,故只能存放低位数的两位即10,故stu.a ==2;
同时位段成员内存的分配也不能超出自身的大小,如32位的设备int为32bit(4个字节),那么最多分配32 bit的大小。
4.位段在内存中的存储形式以及其大小的计算
不同设备和编译器下的位段大小和存储形式是不同的,这是其不能跨平台的原因。
以VS编译器下的char为例:(空间按需求每次开辟int 或char 个字节的空间)
结果1:总大小为3byte
int main() {struct s{//开辟一个char(8bit)char a:3; //8-3 ==5char b:4; //5-4 ==1//剩1 bit不够,开辟第二个char(8bit)char c:5; //8-5=3//剩3 bit不够,开辟第三个char(8bit)char d:4; //故总大小为3 byte};printf("%d\n",sizeof(struct s));return 0;}
结果2:总大小为2 byte
int main() {struct s{//开辟一个char(8bit)char a:3; //8-3 ==5char b:4; //5-4 ==1//剩1 bit不够,开辟第二个char(8bit)char c:5; //8+1-5=4//剩4 bit够,不用开辟,故总大小为2bytechar d:4; //4-4 ==0};printf("%d\n",sizeof(struct s));return 0;}
在vs编译器地下的位段是由第一种计算方法分配内存的。
具体分配如下
由图可以看出来,VS编译器是会舍弃多余的空间,新开辟空间存放新数据,是由该字节的低位——>高位存放。(此处无关字节序,字节之间才和大小端字节序有关)。也可看出当分配空间不够而数据过大的情况会发生截断,如a:3存放10(即01010)时截断。
5.位段的跨平台问题
1.int位段被当作有符号还是无符号是不确定的;
2.位段中最大位的数目是不确定的(16位的机器最大为16,32位的为32,若写成17则在16位机器下会出现问题);
3.位段中的成员在内存中是从左向右分配,还是从右向左的标准尚未定义;
4.当发生上图空白格子的情况,是舍弃还是利用还不确定。
总结:与结构体相比,位段可以很大程度的节省空间(但并不代表一点都不消耗,看上图例子),但其跨平台问题依然存在。使用位段时我们首先要知道数据所占最大的空间才能准确使用其内存大小。
C语言《位段结构体、联合体》相关推荐
- 汉诺塔怎么加计数次数c语言,C语言计算汉诺塔最小移动步数 (二)
前几天写的:C语言计算汉诺塔最小移动步数(一) 当时还不知道用2^n-1这个公式来求解汉诺塔移动步骤.=_= 偶然间在网上发现了这个公式,发现当时写的算法还是比较繁琐的.所以又根据这个公式又写了一个. ...
- R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离、dist函数计算矩阵中两两元素的曼哈顿距离
R语言计算曼哈顿距离(Manhattan Distance)实战:计算两个向量的曼哈顿距离.dist函数计算矩阵中两两元素的曼哈顿距离 目录 R语言计算曼哈顿距离(Manhattan Distance ...
- R语言计算杰卡德相似系数(Jaccard Similarity)实战:自定义函数计算Jaccard相似度、对字符串向量计算Jaccard相似度、将Jaccard相似度转化为Jaccard距离
R语言计算杰卡德相似系数(Jaccard Similarity)实战:自定义函数计算Jaccard相似度.对字符串向量计算Jaccard相似度.将Jaccard相似度转化为Jaccard距离 目录 R ...
- R语言计算平均值的标准误差(standard error of the mean):自定义函数计算平均值的标准误差、使用plotrix包的std.error函数计算平均值的标准误差
R语言计算平均值的标准误差(standard error of the mean):自定义函数计算平均值的标准误差.使用plotrix包的std.error函数计算平均值的标准误差 目录
- R语言计算回归模型每个样本(观察、observation、sample)的DFFITS度量实战:忽略单个观察(样本)时,回归模型所做的预测会发生多大的变化
R语言计算回归模型每个样本(观察.observation.sample)的DFFITS度量实战:忽略单个观察(样本)时,回归模型所做的预测会发生多大的变化 目录
- R语言计算回归模型每个样本(观察、observation、sample)的杠杆值(leverage)实战:如果一个样本的预测变量比其他样本的预测变量值更极端,那么被认为具有很高的杠杆作用
R语言计算回归模型每个样本(观察.observation.sample)的杠杆值(leverage)实战:如果一个样本的预测变量比其他样本的预测变量值更极端,那么被认为具有很高的杠杆作用 目录
- R语言计算每个分组的行数并将结果添加到dataframe中实战
R语言计算每个分组的行数并将结果添加到dataframe中实战 目录 R语言计算每个分组的行数并将结果添加到dataframe中实战 #仿真数据
- R语言计算F1评估指标实战:F1 score、使用R中caret包中的confusionMatrix()函数为给定的logistic回归模型计算F1得分(和其他指标)
R语言计算F1评估指标实战:F1 score.使用R中caret包中的confusionMatrix()函数为给定的logistic回归模型计算F1得分(和其他指标) 目录
- R语言计算dataframe数据列中各分类的计数(类似pandas value_counts函数功能)
R语言计算dataframe数据列中各分类的计数(类似pandas value_counts函数功能) 目录 R语言计算dataframe数据列中各分类的计数(类似pandas value
- R语言计算回归模型标准化残差实战(Standardized Residuals):识别回归模型中离群点
R语言计算回归模型标准化残差实战(Standardized Residuals):识别回归模型中离群点 目录
最新文章
- activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
- dubbo could not get local host ip address will use 127.0.0.1 instead 异常处理
- 路由器中的管理间距和量度参数
- 加载pdf_Java 插入附件到PDF文档
- js 停止事件冒泡 阻止浏览器的默认行为
- Flink1.12 standalone-HA配置(转载+自己验证)
- 删除对于job收缩日志失败547_MySQL中常见的几种日志
- VB 实现UTF-8 与GB2312互转
- hdu1864 最大报销额(01背包)
- 五子棋聊天java_java带聊天的五子棋 适合新手
- 可能有用的篡改检测常识
- linux 双显卡 黑屏 amd,彻底解决AMD显卡win10开机黑屏问题
- 详解5种网站 静态网站、动态网站、伪静态网站、云计算网站都是什么
- 论文阅读:Bi-Modal PMA
- @requestParam与@Param区别
- Ubuntu 更新错误修复大全
- 嵌入式计算机系统简述,嵌入式系统定义_简述嵌入式系统的定义和组成
- 公有云上虚拟机故障恢复
- 16个自媒体平台吐血推荐
- 查询IBM服务器保修期
热门文章
- 【OMNET++】OMNET安装卸载说明以及原理探讨
- 如何从CCleaner清理中排除项目
- 理想的清理软件——CCleaner
- 戴森新一代Airwrap多功能造型器评测:现在都这么「卷」了吗?
- 我被黑马学姐内推了!找工作还真有“捷径”可走......
- 黑马培训教学SSM整合中Security遇到的问题org.springframework.security.access.AccessDeniedException: Access is denied
- 2010年财富杂志全球500强榜公布 沃尔玛居榜首
- [WVR系列路由器] 微信连Wi-Fi功能使用指南
- teamviewer存在linux版本_Ubuntu16.04 安装Teamviewer
- Sklearn官方文档中文整理6——交叉分解,朴素贝叶斯和决策树篇