一、位段的概念
位段的定义与结构体的定义相仿;格式如下:
struct 位段结构名
{
类型说明符1 位段名1:位段长度1; //最低位;
类型说明符2 位段名2:位段长度2; //次低位;
类型说明符3 位段名3:位段长度3;
......
类型说明符N 位段名N:位段长度M; //最高位;
};
位段变量的说明与结构体变量的说明方式相同;可采用两种方式:
先定义后说明、同时定义说明;
位段变量的使用与结构体变量的使用方法相同,有两种形式:
变量: 位段变量名.位段名
指针: 位段指针名->位段名
二、位段的存储规则
(1) 如果相邻的两个位段字段的类型相同,且其位宽之和小于其类型的sizeof()大小,则其后面的位段字段将紧邻前一个字段存储,直到不能容纳为止;
(2) 如果相邻的两个位段字段的类型相同,且其位宽之和大于其类型的sizeof()大小,则后面的位段字段将从下一个存储单元的起始地址处开始存放,其偏移量恰好为其类型的sizeof()大小的整数倍;
(3) 如果相邻的两个位段字段的类型不同,则各个编译器的具体实现有差异,VC6采取不压缩方式,GCC和Dev-C++都采用压缩方式;
(4) 如果位段字段之间穿插着非位段字段,则不进行压缩;
(5)整个位段结构体的大小为其最宽基本类型成员大小的整数倍;
(6) 位段字段在内存中的位置是按照从低位向高位的顺序放置的;
(7) 取地址操作符&不能应用在位段字段上;
接下来我们做一道题以便于理解:编写程序输出各个位段的值。
//FileName: chap10_11.c
#include<stdio.h>
int main()
{
struct cbit
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit, *pbit;
bit.a = 1;
bit.b = 7;
bit.c = 15;
printf("%d,%d,%d\n", bit.a, bit.b, bit.c);
pbit = &bit;
pbit -> a = 0;
pbit -> b &= 3;
pbit -> c |= 1;
printf("%d,%d,%d\n", pbit -> a, pbit -> b, pbit -> c);
return 0;
}
程序运行结果如下:
1,7,15
0,3,15