结构体的定义

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。

结构体之位域全面分析相关推荐

  1. (转)C结构体之位域(位段)

    转载自C结构体之位域(位段) 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简 ...

  2. C结构体之位域(位段)

    C结构体之位域(位段) 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C ...

  3. 结构体之位域(位段)

    结构体之位域(位段) 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语 ...

  4. 结构体 + 联合体 + 位域 使用

    简单介绍结构体 定义结构体,一般是对有相同属性的元素或成员的归纳,比如电机的电气特性:驱动电压.驱动电流.运行速度:还有比如系统报警类:过压报警.过流报警.欠压报警 本人常用格式 typedef  s ...

  5. C语言中结构体的位域(bit-fields)

    有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可.例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.正是基于这种考虑,C语言又提供了一种叫做位域 ...

  6. C 语言编程 — 高级数据类型 — 结构体与位域

    目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...

  7. C++工作笔记-对结构体中位域的补坑说明

    以前关于位域的连接: https://blog.csdn.net/qq78442761/article/details/80102666 对这篇博文进行补坑说明: 如下: structbs { int ...

  8. gcc中的结构体成员位域

    1=============================================== struct test { int m: 1;  //此字段使用一位 }; sizeof(struct ...

  9. c 结构体之位域(位段)

    有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构 ...

最新文章

  1. 关于Horizon 7 Agent与远程桌面(mstsc)兼容性问题解决办法
  2. Cxf + Spring3.0 入门开发WebService
  3. 高级UI之Paint(滤镜,颜色通道,矩阵运算)
  4. 折半查找和二叉排序树的时间性能_leecode刷题----二分搜索与二叉查找(排序)树...
  5. 百度SEO EBCMS(易贝管理系统) v1.2.0
  6. java程序a-z b-y,请完成下列Java程序:对大写的26个英文字母加密,从键盘输入一个大写字母串,输出这个串加密后的结 - 赏学吧...
  7. python编写函数showmsg(n、name)_Python语言答案
  8. last-child 选取不到指定元素,失去效果
  9. 微软未来五年将把80%资源投入云计算
  10. 零基础学习编程会遇到的坑
  11. 用matlab调节窗宽窗位的代码,基于HTML5的PACS HTML5图像处理(7)实现客户端JS调整窗宽窗位...
  12. vue 加载720全景图
  13. vue v-modle实现组件之间的动态传值
  14. 2022-2028年全球与中国辐射屏蔽纺织品行业深度分析
  15. 暗黑如何修改服务器爆率,暗黑破坏神百倍爆率补丁
  16. 修改苹果Mac终端前面的计算机名
  17. gallery3D(3)
  18. 什么是数字证书、公钥私钥
  19. java跑p_javap使用
  20. mysql 1265错误_Mysql出现ERROR 1265: Data truncated for

热门文章

  1. 网络安全隐性杀手:三类危险的TXT文件
  2. MySQL分组查询—按函数分组
  3. 初识ES-什么是elasticsearch
  4. 服务拆分-案例Demo
  5. Nginx全局块的其他配置指令
  6. java分布式应用限流实现
  7. J .U.C 中的原子操作类
  8. core 包的核心类JdbcTemplate
  9. ThreadLocal类以及应用技巧
  10. 数组的定义格式二_静态初始化