C语言 基础十 位域

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。

为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为"位域"或"位段"。所谓"位域"是把一个字节中的二进制位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

位域的成员必须是:int 、unsigned int 、singed int 、char,位域的空间是按照需要以4个字节(int)或1个字节(char)来开辟的。当一个结构体中第一个位域的剩余空间无法容纳下一个位域时,则重新开辟一个大小为下一个位域数据类型的空间来存放。

在结构内声明位域的形式如下:

struct
{
  type [member_name] : width ;
};
  • type :只能为 int(整型),unsigned int(无符号整型),signed int(有符号整型) 三种类型,决定了如何解释位域的值。
  • member_name :位域的名称。
  • width: 位域中位的数量。宽度必须小于或等于指定类型的位宽度。

实例

#include 
#include 
 
/* 定义简单的结构 */
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

当存储的数值超过位域定义的位数,超出范围并不是直接丢弃,而是保留对应的 定义位数的值。

实例

#include 
#include 
 
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 );
 
   Age.age = 10; // 二进制表示为 1010 有四位,超出
   printf( "Age.age : %d\n", Age.age );
   return 0;
}

当上面的代码被编译时,它会带有警告,当上面的代码被执行时,它会产生下列结果:

Sizeof( Age ) : 4
Age.age : 4
Age.age : 7
Age.age : 0
Age.age : 2

你可能感兴趣的:(C)