C-位域

作者: 小石头呢 | 来源:发表于2019-08-05 11:52 被阅读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

相关文章

  • C-位域

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

  • C-作用域规则

    C语言中有三个地方可以声明变量: 在函数或者代码块内部的局部变量 在所有函数外部的全局变量 在形式参数的函数参数定...

  • c 位域

    int 占用4个字节, status1里面有2个int 则占用8字节。为了节省内存空间占用,例如我仅仅用这个变量...

  • C 迷你系列(四) 位域

    位域 位段(或称“位域”,Bit field)为一种 数据结构[https://zh.wikipedia.org/...

  • 隐藏在 OC 中的那些暗招 &位域&联合体&am

    如果没有听说过 isa_t,只是听说过 isa 指针,那么这篇简书值得一看。 一、位域与联合体 1.1 位域 位域...

  • 一分钟技能

    Recognize these scenarios? When Sally got a C- on a test,...

  • C语言中的位运算

    C语言中的位运算 结构体是唯一一种允许控制内存位(bit)的数据结构,称作位域(Bit Field) 位域不能离开...

  • 反转一个链表的思路

    输入:A->B->C->D->E->NULL 输出:E->D->C->B->A->NULL 第一种使用while循...

  • iOS NavigationController栈跳转

    3种跳转方式 a->b->c-> 实现c->a 1.通过修改导航栈来跳转 先修改栈再pop 2.通过popT...

  • C语言----位域

    为什么使用位域 如果程序的结构中包含多个开关量,只有 TRUE/FALSE 变量,如下: 这种结构需要 8 字节的...

网友评论

      本文标题:C-位域

      本文链接:https://www.haomeiwen.com/subject/pnsydctx.html