位域类型对齐
如果相邻的位域字段的类型不同,在不同的位域类型间,按通用的对齐规则进行不同数据类型间的对齐(注意,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 *)∈ #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