位域(bit fields)简介

1、简介

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

2、位域定义

struct-declarator:

declarator

type-specifier declarator opt: constant-expression

与结构定义相仿,其形式为:

  struct 位域结构名

  {

    位域列表

  };

  其中位域列表的形式为: 类型说明符 位域名:位域长度

  例如:

  struct bs

  {

    int a:8;

    int b:2;

    int c:6;

  };

3、位域的相关注意事项

  对于位域的定义尚有以下几点说明:

  1.位域的长度不能大于指定类型固有长度,比如说int的位域长度不能超过32,bool的位域长度不能超过8。

  2.位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

  struct k

  {

    int a:1;

    int :2;/*该2位不能使用*/

    int b:3;

    int c:2;

  };

  从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。

3、位域不能用sizeof运算符进行计算。

4、位域的对齐

  如果结构体中含有位域(bit-field),那么VC中准则是:

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

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

  3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方式(不同位域字段存放在不同的位域类型字节中),Dev-C++和GCC都采取压缩方式;

  系统会先为结构体成员按照对齐方式分配空间和填塞(padding),然后对变量进行位域操作。

struct mybitfields

{

unsigned short a : 4;

unsigned short b : 5;

unsigned short c : 7;

} test;

int main( void );

{

test.a = 2;

test.b = 31;

test.c = 0;

}

the bits would be arranged as follows:

00000001 11110010

cccccccb bbbbaaaa

Since the 8086 family of processors stores the low byte of integer values before the high byte, the integer 0x01F2 above would be stored in physical memory as 0xF2 followed by 0x01.

位域(bit fields)简介相关推荐

  1. C++ 位域(Bit Fields)

    位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数 ...

  2. C语言中的位域 bit field [转]

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

  3. win32 hook 详解

    WIN32钩子 摘译自Win32 Hooks 作者:Kyle Marsh         本文描述钩子及其子MS Win32应用编程接口中的使用,讨论钩子函数. 过滤函数.以及以下类型的钩子: WH_ ...

  4. JDK源码 - BitSet的实现

    java.util.BitSet是个很有趣的类,了解其内部实现对正确的使用非常重要. 对象构造: Java代码   private final static int ADDRESS_BITS_PER_ ...

  5. 嵌入式Linux开发板_WIFI无线网卡驱动移植

    在线课堂:https://www.100ask.net/index(课程观看) 论  坛:http://bbs.100ask.net/(学术答疑) 开 发 板:https://100ask.taoba ...

  6. 基于ARM板s3c2440---wifi网卡

    基础知识 wifi网卡有两种工作模式: 一种是无线终端模式(STA):这个模式就是我们平时用手机连接wifi时的模式,相当于客户端. 一种是无线热点模式(AP):家里的无线路由器均是这个模式,手机开热 ...

  7. 嵌入式Linux——WIFI网卡

    CSDN仅用于增加百度收录权重,排版未优化,日常不维护.请访问:www.hceng.cn 查看.评论. 本博文对应地址: https://hceng.cn/2018/06/21/嵌入式Linux--W ...

  8. 条件随机场CRF简介Introduction to Conditional Random Fields

    Imagine you have a sequence of snapshots from a day in Justin Bieber's life, and you want to label e ...

  9. 自动售货机编程_Rosmaro中基于视觉自动机的编程简介

    自动售货机编程 by Łukasz Makuch 通过ŁukaszMakuch Rosmaro中基于视觉自动机的编程简介 (An introduction to visual automata-bas ...

最新文章

  1. QLibrary 动态加载外部库文件
  2. 数据分析系列:绘制折线图(matplotlib)
  3. python如何绘制曲线图_python怎么画曲线图
  4. Fliptile POJ - 3279 (翻转)(二进制+对第一行暴力遍历翻转的位置)
  5. iOS 怎么设置 UITabBarController 的第n个item为第一响应者?
  6. 码云、coding拉取项目代码
  7. fish-ui 一套基于vue2的ui组件库
  8. 17.电话号码的字母组合(力扣leetcode) 博主可答疑该问题
  9. Java排序之Comparable与Comparator详解
  10. Atlas500 ROS Ubuntu容器硬件接口及网络映射配置
  11. 【面试题】2021最新Vue面试题汇总
  12. YIQ、YUV、YCrCb 与 RGB关系
  13. Macromedia FlashPaper
  14. php 三色排序,三色旗排序问题 | 学步园
  15. Linux关闭防火墙命令
  16. 《战神3》GDC技术制作团队研讨报导
  17. ubuntu开机报错/dev/nume0n1p2:clean解决方案
  18. WRSC无人帆船航行基本原理
  19. 高考排名liuseroj.picp.io
  20. php个人工作日志,每日工作日志范文

热门文章

  1. Asp.Net Core 第02局:Program
  2. 好程序员web前端分享Nodejs学习笔记之Stream模块
  3. Informatica ETL workflow 定时运行功能介绍 scheduler
  4. Protocol Buffer搭建及示例
  5. JavaScript学习笔记——对象知识点
  6. STM8L探索套件学习笔记(转)
  7. 由JS函数返回值引发的一场”血案
  8. 考试题string——线段树。
  9. 大数据和云计算时代的机遇
  10. Java中空值处理的感受