结构体之位域全面分析
结构体的定义
typedef struct TEST
{...
}Test,*pTest;struct TEST
{...
}test
这里的test是一个TEST变量。。
结构体之位域
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
例如:
struct TEST{int a:5;int b:7;int c:3;
};
位域的大小:
一个位域必须存储在同一个字节中,不能跨两个成员变量类型。如一个成员变量所剩空间不够存放另一位域时,应从下一成员变量起存放该位域。也可以有意使某位域 从下一成员变量开始。
拿上面的例子来说吧, sizeof(TEST)=4
struct test3{int a:29;int b:29;int c:4;
};
sizeof(test3)=12;
struct test4{int a:27;int b:27;int c:4;
}
;
sizeof(test4)=8。
位存放的值:
#include<iostream>
using namespace std;struct TEST{int a:5;int b:7;int c:3;
};void main()
{TEST mytest;memcpy(&mytest,"HelloWorld",sizeof(mytest));cout<<mytest.a<<endl; cout<<mytest.b<<endl;cout<<mytest.c<<endl;
}
结果分析:内存拷贝函数只拷贝了4个字符到mytest中,mytest中的三个变量加起来才15位,其它17位我们不要管。那么这15位中的值是怎么样的呢?15位还没到2个字节,所以这15位中全在He中,H的AscII码为72(01001000),e的AscII 码为112(01100101),根据小端法,我们知道他们的存储方式为:01100101 01001000,a占前5位:01000即8;
b占接下来的7位,0101010即42;c占接下来的3位,110即-2(因为这里是有符号数,高位为1,表示负数,所以是-2)。如果把他们全变成unsigned int,如:
struct TEST{unsigned int a:5;unsigned int b:7;unsigned int c:3;
};
那么输出就是:8,42,6。
结构体之位域全面分析相关推荐
- (转)C结构体之位域(位段)
转载自C结构体之位域(位段) 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简 ...
- C结构体之位域(位段)
C结构体之位域(位段) 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C ...
- 结构体之位域(位段)
结构体之位域(位段) 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语 ...
- 结构体 + 联合体 + 位域 使用
简单介绍结构体 定义结构体,一般是对有相同属性的元素或成员的归纳,比如电机的电气特性:驱动电压.驱动电流.运行速度:还有比如系统报警类:过压报警.过流报警.欠压报警 本人常用格式 typedef s ...
- C语言中结构体的位域(bit-fields)
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可.例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.正是基于这种考虑,C语言又提供了一种叫做位域 ...
- C 语言编程 — 高级数据类型 — 结构体与位域
目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...
- C++工作笔记-对结构体中位域的补坑说明
以前关于位域的连接: https://blog.csdn.net/qq78442761/article/details/80102666 对这篇博文进行补坑说明: 如下: structbs { int ...
- gcc中的结构体成员位域
1=============================================== struct test { int m: 1; //此字段使用一位 }; sizeof(struct ...
- c 结构体之位域(位段)
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构 ...
最新文章
- 关于Horizon 7 Agent与远程桌面(mstsc)兼容性问题解决办法
- Cxf + Spring3.0 入门开发WebService
- 高级UI之Paint(滤镜,颜色通道,矩阵运算)
- 折半查找和二叉排序树的时间性能_leecode刷题----二分搜索与二叉查找(排序)树...
- 百度SEO EBCMS(易贝管理系统) v1.2.0
- java程序a-z b-y,请完成下列Java程序:对大写的26个英文字母加密,从键盘输入一个大写字母串,输出这个串加密后的结 - 赏学吧...
- python编写函数showmsg(n、name)_Python语言答案
- last-child 选取不到指定元素,失去效果
- 微软未来五年将把80%资源投入云计算
- 零基础学习编程会遇到的坑
- 用matlab调节窗宽窗位的代码,基于HTML5的PACS HTML5图像处理(7)实现客户端JS调整窗宽窗位...
- vue 加载720全景图
- vue v-modle实现组件之间的动态传值
- 2022-2028年全球与中国辐射屏蔽纺织品行业深度分析
- 暗黑如何修改服务器爆率,暗黑破坏神百倍爆率补丁
- 修改苹果Mac终端前面的计算机名
- gallery3D(3)
- 什么是数字证书、公钥私钥
- java跑p_javap使用
- mysql 1265错误_Mysql出现ERROR 1265: Data truncated for