快捷搜索:  汽车  科技

c语言结构体的位域(C语言编程之位结构)

c语言结构体的位域(C语言编程之位结构)unsigned incon: 8; /*incon占用低字节的0~7共8位*/struct{} 位结构变量;其中: 数据类型必须是char或16位int(unsigned或signed)。 整型常数必须是非负的整数 范围是0~15 表示二进制位的个数 即表示有多少位。变量名是选择项 可以不命名 这样规定是为了排列需要。例如: 下面定义了一个位结构。

c语言结构体的位域(C语言编程之位结构)(1)


位结构是一种特殊的结构 在需按位访问一个字节或字的多个位时 位结构比按位运算符更加方便。位结构定义的一般形式为:

struct位结构名{

数据类型 变量名: 整型常数;

数据类型 变量名: 整型常数;

} 位结构变量;

其中: 数据类型必须是char或16位int(unsigned或signed)。 整型常数必须是非负的整数 范围是0~15 表示二进制位的个数 即表示有多少位。变量名是选择项 可以不命名 这样规定是为了排列需要。

例如: 下面定义了一个位结构。

struct{

unsigned incon: 8; /*incon占用低字节的0~7共8位*/

unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/

unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/

unsigned blink: 1; /*blink占用高字节的第7位*/

}ch;

位结构成员的访问与结构成员的访问相同。

例如: 访问上例位结构中的bgcolor成员可写成:

ch.bgcolor

注意:

1. 位结构中的成员可以定义为unsigned 也可定义为signed 但当成员长度为1时 会被认为是unsigned类型。因为单个位不可能具有符号。

2. 位结构中的成员不能使用数组和指针 但位结构变量可以是数组和指针 如果是指针 其成员访问方式同结构指针。

3. 位结构总长度(位数) 是各个位成员定义的位数之和 可以超过两个字节。

4. 位结构成员可以与其它结构成员一起使用。

例如:

struct info{

char name[8];

int age;

struct addr address;

float pay;

unsigned state: 1;

unsigned pay: 1;

}workers;’

上例的结构定义了关于一个工从的信息。其中有两个位结构成员 每个位结构成员只有一位 因此只占一个字节但保存了两个信息 该字节中第一位表示工人的状态 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。

问题的解答

结构struct x 有三个成员s1 s2 s3每一个成员占3 bit,结构与char c union ;

char 一般机器占一个字节(8 bit 100 二进制值为:01100100 所以s1后三bit(6 7 8 bit) :100,s2为中间三位(3 4 5 bit)为100 s3为01 所以printf(”%d/n” v.x.s3)是1 其它是4。现在大多数系统都是将低字位放在前面,而结构体中位域的申明一般是先声明高位。

100 的二进制是 001 100 100

低位在前 高位在后

001—-s3

100—-s2

100—-s1

所以结果应该是 1

如果先申明的在低位则:

001—-s1

100—-s2

100—-s3

结果是 4

其中unsigned short s1:3; 中的“:”又是什么意思?

指定位段 3代表预定s1占3bit.

为什么是4?

struct

{

unsigned short s1:3; //一个字节. 虽然预定为3bit 但系统的存储空间为至少一字节.

unsigned short s2:3; //一个字节

unsigned short s3:3; //一个字节

}x;

这样在联合union中最大的成员为三个字节 而最终结果为了内存对齐(对齐为4的倍数).取为4


位结构在DSP、MCU等嵌入式中广泛应用。


~~~end~~~

猜您喜欢: