位域
  有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
  一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:  
  struct 位域结构名  
  { 位域列表 };
  其中位域列表的形式为: 类型说明符 位域名:位域长度  
  例如:
  struct bs
  {
  int a:8;
  int b:2;
  int c:6;
  };  
  位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:
  struct bs
  {
  int a:8;
  int b:2;
  int c:6;
  }data;  
  说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:
  1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
  struct bs
  {
  unsigned a:4
  unsigned :0 /*空域*/
  unsigned b:4 /*从下一单元开始存放*/
  unsigned c:4
  }
  在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
  2. 位域的长度不能大于一个int的长度,也就是说不能超过32位。
  3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
  struct k
  {
  int a:1
  int :2 /*该2位不能使用*/
  int b:3
  int c:2
  };  
  从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。
  二、位域的使用
  位域的使用和结构成员的使用相同,其一般形式为: 位域变量名·位域名 位域允许用各种格式输出。
  main(){
  struct bs
  {
  unsigned a:1;
  unsigned b:3;
  unsigned c:4;
  } bit,*pbit;
  bit.a=1;
  bit.b=7;
  bit.c=15;
  printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
  pbit=&bit;
  pbit->a=0;
  pbit->b&=3;
  pbit->c|=1;
  printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
  }  
  上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。
  程序的9、10、11三行分别给三个位域赋值。( 应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针 方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=", 该行相当于: pbit->b=pbit->b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为 3)。同样,程序第16行中使用了复合位运算"|=", 相当于: pbit->c=pbit->c|1其结果为15。程序第17行用指针方式输出了这三个域的值。
  为了节省空间,可以把几个数据压缩到少数的几个类型空间上,比如需要表示二个3位二进制的数,一个2位二进制的数,则可以用一个8位的字符表示之。
  struct  
  {
  char a : 3;
  char b : 3;
  char c : 2;
  } ;
  这个结构体所占空间为一个字节,8位。节省了空间。

unsigned a:1;相关推荐

  1. 分析两小段c++代码 关于unsigned运算的坑

    代码1 #include <stdio.h> #include <iostream> using namespace std;int main() {unsigned int ...

  2. c++ int转unsigned int_mysql中int、bigint、smallint 和 tinyint的区别详细介绍

    1 bytes = 8 bit ,一个字节最多可以代表的数据长度是2的8次方 11111111 在计算机中也就是 -128到127 1.BIT[M] 位字段类型,M表示每个值的位数,范围从1到64,如 ...

  3. srand((unsigned)time(NULL))详解

    版权声明:本文为博主原创文章,未经博主允许不得转载.    https://blog.csdn.net/jx232515/article/details/51510336 srand函数是随机数发生器 ...

  4. 打印不同对象的字节表示 ( 对int*强制转换成unsigned char*的理解 )

    此文章参考<深入理解计算机系统>P31. 先看如下代码:  12345的十六进制表示为:0x00003039 1 #include <stdio.h> 2 3 int main ...

  5. linux 下byte,char,unsigned char的区别

    在linux中,对byte的定义为无符号char,而char默认为有符号char. #ifndef BYTE #define BYTE unsigned char #endif 以下ZZ百度知道: 在 ...

  6. mysql unsigned zerofill_Mysql中Unsigned和Zerofill数据型的使用(细节也很重要啊)

    一.今天开同事在使用Mysql的时候,错误使用了Unsigned和Zerofill了,大概是不是蛮懂这两个使用场景吧.很多东西,细节都是很重要的,不能随便用的. decimal是浮点型,使用Unsig ...

  7. 报错解决:undefined reference to `snappy::MaxCompressedLength(unsigned long)'

    下午在编译phxpaxos的样例时报错了,报错如下: g++ echo_sm.o echo_server.o main.o -o phxecho -L/home/zhang/phxpaxos/.lib ...

  8. 为什么不能够用unsigned 修饰 float和double

    最近犯了一个错误: 定义变量类型的时候竟然定义了unsigned double的类型.由于编译能够通过,因此一直没有发现这样写会有什么样的问题. 今天一次偶然的测试中发现这些变量的值都是整数.一开始觉 ...

  9. 腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?

    1.腾讯面试题:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中? 思想:用数组来存这40亿个数,而且只能用bit来表示.why? ...

  10. unsigned int vs. size_t

    我注意到现代C和C ++代码似乎在任何地方使用size_t而不是int / unsigned int - 从C字符串函数的参数到STL. 我很好奇这个原因及其带来的好处. #1楼 size_t类型是无 ...

最新文章

  1. 一文搞懂TCP的三次握手和四次挥手
  2. 通过gps给定的两个经纬度坐标,计算两点之间的距离
  3. 1.1 基本图像导入、处理和导出
  4. PAT甲级1005 Spell It Right :[C++题解]字符串处理
  5. Kotlin1.6.20好用的新特性:多receiver扩展函数,绝不可空类型,并行编译kotlin减少编译时间
  6. Spark编程指南(Python版)
  7. 生产系统遇到的问题:producers blocked
  8. PING检查网络是否畅通
  9. [蓝桥杯]字符串对比-模拟
  10. 【炼数成金 NOSQL引航 三】 Redis使用场景与案例分析
  11. 线程池与Threadlocal
  12. IOS OpenGL ES 图像扩展边缘黑白模糊 GPUImageDilationFilter
  13. 计算机原理 做实验报告,微机原理实验报告心得体会
  14. springboot的web进阶知识(2)
  15. 浅谈软件项目开发过程中的主要项目风险及对策
  16. mysql wait for flush,Mysql线程大量Wating For table flush问题分析
  17. 【微机原理与接口 4】—— 寻址方法与指令系统 1(16位寻址方式解析)
  18. php 405错误怎样重现,phpmyadmin出现405错误怎么办?
  19. 自媒体平台有哪些?如何找到一个适合自己的自媒体平台?
  20. IaaS、PaaS、SaaS、DaaS——各种云服务模式一览

热门文章

  1. php实现上传图片保存到数据库的方法
  2. Linux运维系统工程师与java基础学习系列-6
  3. Spring+Mybatis 多数据源配置
  4. Citrix XenApp下一些解决和未解决的问题
  5. 郁闷的 ConfigurationManager.OpenExeConfiguration
  6. 中石油训练赛 - Trading Cards(最大权闭合子图)
  7. POJ - 3281 Dining(最大流+思维建边)
  8. POJ - 3662 Telephone Lines(分层图最短路)
  9. 2019ICPC(沈阳) - Fish eating fruit(树形dp+树根转移)
  10. 程序员初试和复试_程序员因肌肉发达面试被质疑能力,网友:这做程序员有啥关系呢?...