详解C语言位域的使用与注意事项

 更新时间:2016年12月20日 11:32:47   作者:zhenhuaqin  
所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。下面这篇文章就给大家介绍下关于C语言中位域的使用与注意事项。

位域的定义

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几 个不同的对象用一个字节的二进制位域来表示。

位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:

struct 位域结构名
  { 位域列表 };
eg:struct weiyu {
         int a:2;
         int b:5;
         int  :5;//此五位为空域,不能使用    
         int c:3;
          }

位域虽然简单好用,但使用时需要注意:

     1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;

     2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

     3) 整个结构体的总大小为最宽基本类型成员大小的整数倍。

     4) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式,Dev-C++采取压缩方式;

     5) 如果位域字段之间穿插着非位域字段,则不进行压缩;(不针对所有的编译器)

注意:4 ,5跟编译器有较大的关系,使用时要慎重,尽量避免。

#include "stdio.h"
void main(int argn ,char *argv)
{
  struct   test {
    unsigned a:10;
    unsigned b:10;
    unsigned c:6;
    unsigned :2;//this two bytes can't use
    unsigned d:4;
    }data,*pData;
  data.a=0x177;
  data.b=0x111;
  data.c=0x7;
  data.d=0x8;
  
  pData=&data;
  printf("data.a=%x data.b= %x data.c=%x data.d=%xn",pData->a,pData->b,pData->c,pData->d);//位域可以使用指针
  printf("sizeof(data)=%dn",sizeof(data));  //4 bytes ,最常用的情况
  struct testLen{
  char a:5;
  char b:5;
  char c:5;
  char d:5;
  char e:5;
  }len;
  
  printf("sizeof(len)=%dn",sizeof(len));   //5bytes 规则2
  struct testLen1{
    char a:5;
    char b:2;
    char d:3;
    char c:2;
    char e:7;
    }len1;
  printf("sizeof(len1) =%dn",sizeof(len1));  //3bytes 规则1
  struct testLen2{
    char a:2;
    char :3;
    char b:7;
    long d:20; //4bytes
    char e:4;
    }len2;
  printf("sizeof(len2)=%dn",sizeof(len2)); //12 规则3,4,5,总长为4的整数倍,2+3 占1byte,b占1bye 由于与long对其,2+3+7 占4字节,后面 d 与 e进行了优化 占一个4字节
  struct testLen3{
    char a:2;
    char :3;
    char b:7;
    long d:30;
    char e:4;
    }len3;
  printf("sizeof(len3)=%dn",sizeof(len3));//12 规则3,4,5,总长为4的整数倍,2+3 占1byte,b占1bye 由于与long对其,2+3+7 占4字节,后面 d占一个4字节,为了保证与long对其e独占一个4字节
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用C语言能带来一定的帮助,如果有疑问大家可以留言交流。

相关文章

  • C语言数据结构 link 链表反转的实现

    C语言数据结构 link 链表反转的实现

    这篇文章主要介绍了C语言数据结构 link 链表反转的实现的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • C++中的整型

    C++中的整型

    这篇文章我们来聊聊C++中的整型,整型即整数,与小数对应。许多语言只能表示一种整型(如Python),而在C++当中根据整数的范围提供了好几种不同的整型,下面文章我们就来看看具体是哪几种,需要的朋友也可以参考一下
    2021-11-11
  • C语言练习题:自由落体的小球简单实例

    C语言练习题:自由落体的小球简单实例

    下面小编就为大家带来一篇C语言练习题:自由落体的小球简单实例。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧
    2016-05-05
  • C++ namespace案例详解

    C++ namespace案例详解

    这篇文章主要介绍了C++ namespace案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C++预定义的流对象基本示例详解

    C++预定义的流对象基本示例详解

    这篇文章主要为大家介绍了C++预定义的流对象基本示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • 基于Turbo C(V2.0)编译错误信息的详细介绍

    基于Turbo C(V2.0)编译错误信息的详细介绍

    本篇文章对Turbo C(V2.0)编译的错误信息进行了详细的介绍。需要的朋友参考下
    2013-05-05
  • C语言实现单元测试的示例详解

    C语言实现单元测试的示例详解

    单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。这篇文章主要为大家介绍了C语言实现单元测试的方法,需要的可以参考一下
    2022-09-09
  • 手动添加bits/stdc++.h到vs2017的详细步骤

    手动添加bits/stdc++.h到vs2017的详细步骤

    这篇文章主要介绍了手动添加bits/stdc++.h到vs2017的详细步骤,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 用C语言实现三子棋小游戏

    用C语言实现三子棋小游戏

    这篇文章主要为大家详细介绍了用C语言实现三子棋小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C语言实现学生学籍管理系统课程设计

    C语言实现学生学籍管理系统课程设计

    这篇文章主要为大家详细介绍了C语言实现学生学籍管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07

最新评论