C语言-数据结构-位域
来源:互联网 发布:风扇转速测试软件 编辑:程序博客网 时间:2024/06/11 11:13
1.位域的概念
在程序中,某些信息存储时不需要一个完整的字节,只需要几位,为节省存储空间C语言支持“位域”的结构体。具体说就是,将一个字节分为几个段,每一段表示一个对象,这样一个字节就可以表示多个对象。
2.位域的定义
位域定义与结构定义相仿,其形式为:
struct 位域结构名
{
位域列表 /* 其中位域列表的形式为: 类型说明符 位域名:位域长度 */
};
例如:
struct bs
{
};
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。
3.位域的存储说明(32位,VC环境)
*整个结构体的总大小为最宽基本类型成员大小的整数倍
如果st 为位域结构体实例,则sizeof(st)的长度为st中位域列表内最长的类型的整数倍。即st实际存储35位,位域列表内最长类型为int(4bytes),则sizeof(st)=8。
a.如果结构体内相邻邻域字段的类型相同,且位数之和小于该字段类型的长度(sizeof),则后面的字段依次存储。
例如
# include <iostream># include <string>using namespace std;struct s_bits{ int i1:8; int i2:5; int i3:12;};void main(){ s_bits s1; cout<<sizeof(s1)<<endl; system("pause");}
输出为:4
实际为:8+5+12位
b.如果结构体内相邻邻域字段的类型相同,但位数之和大于该字段类型的长度(sizeof),下一个字段应该从下一个类型长度单元开始存储。
例如:
# include <iostream># include <string>using namespace std;struct s_bits{ int i1:20; int i2:15; int i3:12;};void main(){ s_bits s1; cout<<sizeof(s1)<<endl; system("pause");}
输出为:8
实际为:4*8+15+12位
c.如果结构体内相邻邻域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式(不同位域字段存放在不同的位域类型字节中),Dev-C++和GCC都采取压缩方式。 对VC来说下一位域按照较大的类型长度偏移开始存储。
# include <iostream># include <string>using namespace std;struct s_bits{ int i1:8; int i2:5; char c1:6; short s1:4; short s2:15;};void main(){ s_bits s1; cout<<sizeof(s1)<<endl; system("pause");}
输出为:12
实际为:4*8+2*8+2*8+2*8
d.如果位域字段之间穿插着非位域字段,则不进行压缩;
d.如果位域字段之间穿插着非位域字段,则不进行压缩;
参考:
1.http://blog.sina.com.cn/s/blog_3d8529400100istl.html#cmt_2350310
0 0
- C语言-数据结构-位域
- 位域--C语言中的一种数据结构
- 生僻的C语言数据结构:位域
- C语言 位域
- c语言位域
- c语言位域
- C语言位域
- C语言 位域
- C语言位域!
- c语言--位域
- C语言位域
- c语言位域
- C语言位域
- C语言--位域
- c语言位域
- C语言:位域
- c语言位域
- c语言位域
- 嵌入式Linux下pppd通过GPRS拨号上网(CLM920模块)
- wget https://www.baidu.com 报错ERROR: certificate common name `baidu.com' doesn't match requested host
- C语言队列的链接表示
- scrollReveal.js – 页面滚动显示动画JS
- 设计模式第四节:Singleton(单例模式)
- C语言-数据结构-位域
- JavaScript:HTML5跨文档消息传递
- tjut 2586
- 在Tomcat7.0中设置默认服务器和不加端口名访问
- 基于jsp的新闻发布系统
- History 对象
- linux默认网关的设置
- 让shell脚本中的echo输出带颜色
- -[NSNull countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x3e4e