位域类型对齐

如果相邻的位域字段的类型不同,在不同的位域类型间,按通用的对齐规则进行不同数据类型间的对齐(注意,struct的长度是其内部最宽类型的整数倍)。如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式(不同位域字段存放在不同的位域类型字节中),Dev-C++和GCC都采取压缩方式;

1、

struct bs{
    unsigned a:4;
    char b:4 ;
    unsigned c:4;
}data;
//占12个字节

2、

#include<stdio.h>

typedef unsigned int uint32_t;   
void inet_ntoa(uint32_t in)    
{    
    char b[18];    
    register char *p;    
    p = (char *)&in;    
    #define UC(b) (((int)b)&0xff)    
    sprintf(b, "%d.%d.%d.%d\n", UC(p[0]), UC(p[1]), UC(p[2]), UC(p[3]));    
    printf(b);    
}    
int main()    
{    
   inet_ntoa(0x123456aa);  
   inet_ntoa(0xaa654321);   
   return 0;
}  
输出
170.86.52.18
33.67.101.170

3、

#include<stdio.h>

union {
    struct  
    {
        unsigned char a1:2;
        unsigned char a2:3;
        unsigned char a3:3;
    }x;
    unsigned char b;
}d;
int main(int argc, char* argv[])
{
    d.b = 100;

    printf("a1:%u\n", d.x.a1);
    printf("a2:%u\n", d.x.a2);
    printf("a3:%u\n", d.x.a3);

    return 0;
} 

输出:

0 1 3