转载:位域
来源:互联网 发布:网络机柜布置图 编辑:程序博客网 时间:2024/06/05 11:07
转载文章来自:http://www.cnblogs.com/my_life/articles/2293397.html
位域成员不能单独被取sizeof值(编译报错),我们这里要讨论的是含有位域的结构体的sizeof,只是考虑到其特殊性而将其专门列了出来。
C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展,允许其它类型类型的存在。使用位域的主要目的是压缩存储,其大致规则为:
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;
4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。
和结构体一样,位结构体也是按照成员的最大长度字节来对齐分配空间的。
测试:
struct test
{
char a:1;
char :2;
long b:3;
char c:2;
};
test t1;
int len=sizeof(t1); //len=12,前两个位域共用一个char空间,按第三个位域long扩展为4字节空间,最后一个位域占用一个char空间,按最长位域空间扩展为4字节。
struct test
{
char f1 : 3;
short f2 : 4;
char f3 : 5;
};
test t1;
int len=sizeof(t1); //len=6,第一位域占用一个char空间,按第二个位域short扩展为2字节空间,最后一个位域占用一个char空间,按最长位域空间扩展为2字节。
如果位域上的整形范围值是0,则下个位域从新的字节开始,前一字段后面空出的所有字节都不使用(即使是同类型的位域),如:
struct bs
{
unsigned a:4;
unsigned :0; // 空域
unsigned b:4; // 从新字节开始存放
unsigned c:4;
} ;
sizeof(unsigned) == 4
上面这个位域定义中,a占第一字节的4位,第一个字节的后4位以及后面的3个字节都填0表示不使用,b从新的字节开始,占用4位,c占用4位。上面位结构体大小为:8
struct test
{
char a:1;
char :2;
char b:3;
long c:2;
};
test t1;
int len=sizeof(t1); //len=8
struct test
{
char a:1;
char :2;
char b:3;
char c:2;
};
test t1;
int len=sizeof(t1); //len=1
union V {
struct X {
unsigned char s1:2;
unsigned char s2:3;
unsigned char s3:3;
} x;
unsigned char c;
} v;
v.c = 100;
printf("%d", v.x.s3);
}
a.t = 'b';效果相当于 a.t= 'b' & 0xf;
'b' --> 01100010
'b' & 0xf -->>00000010
所以输出Ascii码为2的特殊字符
- 转载:位域
- 代为转载、、、、位运算
- 【转载】位运算
- TCP标志位#转载#
- 转载:位运算
- 结构体中的冒号:位域(转载)
- [转载]c++位运算介绍
- 【转载】Java位运算总结
- 转载-64位系统和32位区别
- 位结构(按位运算和存储)(转载)
- 32位代码优化常识(转载)
- 32位cpu寻址小结(转载)
- 位运算(转载于互联网)
- C/C++位操作技巧 【转载】
- 转载天大一位学长的帖子
- 位运算符小结(转载+修改)
- java 位运算权限管控(转载)
- 【转载】java位操作符查漏补缺
- centos安装后要做的事情
- Win8 背景 颜色大全
- 安装 卸载 windows服务
- Eclipse编写Android程序时layout的xml里的id不能在R.java里自动生成
- win环境下,用虚拟化工具打包Qt动态编译exe的过程
- 转载:位域
- 数组指针
- JNI引用与垃圾回收
- 1004. Counting Leaves
- 面向对象_成员变量_ 局部变量_匿名对象_封装_构造函数_构造代码块
- 主键的选择
- Oracle 11g AWR 系列四:AWR baseline template 的管理
- 实战Drupal Hook_query_alter 修改排序方式
- 黑马程序员——Java基础语法:利用位运算实现的基础进制转换