C-位域
2019-08-05 本文已影响0人
小石头呢
位域:是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
一.位域的定义使用
struct 位域结构名{
type [member_name] : width ;
type [member_name] : width ;
...
} 位域变量说明;
- type:整数类型,决定了如何解释位域的值。类型可以是整型、有符号整型、无符号整型。
- member_name:位域的名称。
- width:位域中位的数量。宽度必须小于或等于指定类型的位宽度。
#include <stdio.h>
#include <string.h>
/* 定义简单的结构 */
struct{
unsigned int widthValidated;
unsigned int heightValidated;
} status1;
/* 定义位域结构 */
struct{
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
} status2;
int main( ){
printf( "Memory size occupied by status1 : %d\n", sizeof(status1));
printf( "Memory size occupied by status2 : %d\n", sizeof(status2));
return 0;
}
//运行结果
Memory size occupied by status1 : 8
Memory size occupied by status2 : 4
定义一个位域变量和定义枚举和结构体变量类似,同样有三种方式
二.位域的存储大小
-
如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
-
如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
-
位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的
-
整个结构体的总大小为最宽基本类型成员大小的整数倍。
//不能合并10>sizeof(char)
typedef struct AA{
unsigned char b1:5;
unsigned char b2:5;
unsigned char b3:5;
unsigned char b4:5;
unsigned char b5:5;
}AA;/*sizeof(AA) = 5*/
//可以合并10<sizeof(unsigned int)
typedef struct BB {
unsigned int b1:5;
unsigned int b2:5;
unsigned int b3:5;
unsigned int b4:5;
unsigned int b5:5;
}BB;/*sizeof(BB) = 4*/
typedef struct CC {
int b1:1;
int :2;//无影响
int b3:3;
int b4:2;
int b5:3;
short b6:4;
int b7:1;
}CC; /*sizeof(CC) = 12*/
#include <stdio.h>
#include <string.h>
struct{
unsigned int age : 3;
} Age;
int main( ){
Age.age = 4;
printf( "Sizeof( Age ) : %d\n", sizeof(Age) );
printf( "Age.age : %d\n", Age.age );
Age.age = 7;
printf( "Age.age : %d\n", Age.age );
Age.age = 8; // 二进制表示为 1000 有四位,超出
printf( "Age.age : %d\n", Age.age );
return 0;
}
//运行结果
Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0