C-位域

2019-08-05  本文已影响0人  小石头呢

位域:是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。这样就可以把几个不同的对象用一个字节的二进制位域来表示。

一.位域的定义使用

struct 位域结构名{
  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

定义一个位域变量和定义枚举和结构体变量类似,同样有三种方式

二.位域的存储大小

//不能合并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
上一篇下一篇

猜你喜欢

热点阅读