wordpress地址和站点地址错,html5新手做的网页,嘉兴公司制作网站的,如何搭建静态网站源码含位域结构体的sizeof: 前面已经说过#xff0c;位域成员不能单独被取sizeof值#xff0c;我们这里要讨论的是含有位域的结构体的sizeof#xff0c;只是考虑到其特殊性而将其专门列了出来。 C99规定int、unsigned int和bool可以作为位域类型#xff0c;但编译器几乎都对此作… 含位域结构体的sizeof: 前面已经说过位域成员不能单独被取sizeof值我们这里要讨论的是含有位域的结构体的sizeof只是考虑到其特殊性而将其专门列了出来。 C99规定int、unsigned int和bool可以作为位域类型但编译器几乎都对此作了扩展允许其它类型类型的存在。 使用位域的主要目的是压缩存储其大致规则为 1) 如果相邻位域字段的类型相同且其位宽之和小于类型的sizeof大小则后面的字 段将紧邻前一个字段存储直到不能容纳为止 2) 如果相邻位域字段的类型相同但其位宽之和大于类型的sizeof大小则后面的字 段将从新的存储单元开始其偏移量为其类型大小的整数倍 3) 如果相邻的位域字段的类型不同则各编译器的具体实现有差异VC6采取不压缩方 式Dev-C采取压缩方式 4) 如果位域字段之间穿插着非位域字段则不进行压缩 5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。 还是让我们来看看例子。示例1 struct BF1 { char f1 : 3; char f2 : 4; char f3 : 5; };其内存布局为 |__f1___|____f2___ |__|____f3______|______| |__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|__|位域类型为char第1个字节仅能容纳下f1和f2所以f2被压缩到第1个字节中而f3只能从下一个字节开始。因此sizeof(BF1)的结果为2。示例2 struct BF2 { char f1 : 3; short f2 : 4; char f3 : 5; };由于相邻位域类型不同在VC6中其sizeof为6在Dev-C中为2。示例3 struct BF3 { char f1 : 3; char f2; char f3 : 5; };非位域字段穿插在其中不会产生压缩在VC6和Dev-C中得到的大小均为3。 写出下列程序在X86上的运行结果。 struct mybitfields{unsigned short a : 4;unsigned short b : 5;unsigned short c : 7;}test;void main(void) {int i;test.a2;test.b3;test.c0;i*((short *)test);printf(%d ,i);}这个题的为难之处呢就在于前面定义结构体里面用到的冒号如果你能理解这个符号的含义那么问题就很好解决了。这里的冒号相当于分配几位空间也即在定义结构体的时候分配的成员a 4位的空间 b 5位c 7位一共是16位正好两个字节。下面画一个简单的示意变量名 位数test 15 14 13 12 11 10 9 |8 7 6 5 4 |3 2 1 0test.a | |0 0 1 0test.b |0 0 0 1 1 |test.c 0 0 0 0 0 0 0 | |在执行i*((short *)test); 时取从地址test开始两个字节short占两个字节的内容转化为short型数据即为0x0032再转为int型为0x00000032即50。输出的结果就是50。当然这里还涉及到字节及位的存储顺序问题后面再说。前面定义的结构体被称为位结构体。所谓位结构体是一种特殊的结构体在需要按位访问字节或字的一个或多个位时位结构体比按位操作要更方便一些。位结构体的定义方式如下struct [位结构体名]{数据类型 变量名:整数常数;...}位结构变量;说明1这里的数据类型只能为int型包括signed和unsigned2整数常数必须为0~15之间的整数当该常数为1时数据类型为unsigned显然嘛只有一位咋表示signed光一符号没意义呀3按数据类型变量名:整数常数;方式定义的结构成员称为位结构成员好像也叫位域在一个位结构体中可以同时包含位结构成员及普通的结构成员4位结构成员不能是指针或数据但结构变量可以是指针或数据5位结构体所占用的位数由各个位结构成员的位数总各决定。如在前面定义的结构体中一共占用45716位两个字节。另外我们看到在定义位结构成员时必须指定数据类型这个数据类型在位结构体占用多少内存时也起到不少的作用。举个例子struct mybitfieldA{char a:4;char b:3;}testA;struct mybitfieldB{short a:4;short b:3;}testB;这里testA占用一个字节而testB占用两个字节。知道原因了吧。在testA中是以char来定义位域的char是一个字节的因此位域占用的单位也按字节做单位也即如果不满一个字节的话按一个字节算未定义的位按零处理。而在testB中short为两个字节所以了不满两个字节的都按两个字节算未定义位按零处理关于位结构体在内存中的存储问题Kevins Theory #2: In a C structure that contains bit fields, if field A is defined in front of field B, then field A always occupies a lower bit address than field B. 来自http://www.linuxforum.net/forum/showflat.php?CatBoardlinuxkNumber638637page0viewcollapsedsb5oallfpartall说的是在C结构体中如果一个位域A在另一个位域B之前定义那么位域A将存储在比B小的位地址中。如果一个位域有多个位时各个位的排列顺序通常是按CPU的端模式(Endianess来进行的即在大端模式(big endian下高有效位在低位地址小端模式则相反。补充说明一个关于位域与普通结构成员一起使用的问题先看一个例子struct mybitfield{char a:4;char b:3;char aa;char c:1;}test;这种情况下test应该占几个字节呢2个4318占一个字节aa占一个还是3个43不足补一位占一个字节aa占一个字节c占一个字节写个小程序验证一下int main(int argc, char* argv[]){int i;test.a 1;test.b 1;test.aa 1;test.c 1;i*((short *)test);printf(%d /n,i);return 0;}输出结果是273化为十六进制数0x111可见是按三个字节来处理了如果按两个字节处理的话cba组成一个字节是10010001十六进制0x91再加上aa那就应该是0x191了举这个例子是为了说明一下定义位域的话最好是把所以有位域放在一起这样可以节省空间如果把c和aa换一下位置那test就只占两个字节了。另外也是为了强调一下位结构体的内存分配方式按定义的先后顺序来分配而位域或成员内的字节顺序则按照CPU的位顺序来进行一般与CPU的端模式对应。 struct mybitfields{unsigned short a : 4;unsigned short b : 5;unsigned short c : 7;} test; sizeof(test) 2;struct mybitfields{unsigned char a : 4;unsigned char b : 5;unsigned char c : 7;} test; sizeof(test) 3;struct mybitfields{unsigned char a : 4;unsigned short b : 5;unsigned char c : 7;} test; sizeof(test) 6;struct mybitfields{unsigned short a : 4;unsigned char b : 5;unsigned char c : 7;} test; sizeof(test) 4;struct mybitfields{unsigned char a : 4;unsigned char b : 5;unsigned short c : 7;} test; sizeof(test) 4;struct mybitfields{unsigned char a : 4;unsigned int b : 5;unsigned short c : 7;} test; sizeof(test) 12;转载于:https://www.cnblogs.com/llinzuxin/archive/2012/04/02/2950626.html