C语言-数据结构-位域

来源:互联网 发布:风扇转速测试软件 编辑:程序博客网 时间:2024/06/11 11:13

1.位域的概念

    在程序中,某些信息存储时不需要一个完整的字节,只需要几位,为节省存储空间C语言支持“位域”的结构体。具体说就是,将一个字节分为几个段,每一段表示一个对象,这样一个字节就可以表示多个对象。

2.位域的定义

位域定义与结构定义相仿,其形式为:
struct 位域结构名
{

  位域列表 /* 其中位域列表的形式为: 类型说明符 位域名:位域长度 */

 };
例如:
struct bs
{
    int a:8;
    int b:2;
};
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。

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.如果位域字段之间穿插着非位域字段,则不进行压缩;

参考:

1.http://blog.sina.com.cn/s/blog_3d8529400100istl.html#cmt_2350310




0 0