有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有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. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

struct k
{
int a:1
int :2 /*该2位不能使用*/
int b:3
int c:2
};

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

又:

1:指针类型变量不能指定所占的位数
2. 在声明成员变量时,可以用         变量名 :bit数;
来确定结构体类型的成员变量的值所占的字位数,如果在实际应用中,该变量的值超出了在声明它时所声明的字位数,那么溢出的部分将会丢失。

例子:

#include <cstdlib>
#include <iostream>

using namespace std;

struct BitVariable {
       unsigned a:2;
       unsigned b:3;
       unsigned :0;
       unsigned c:6;
      
      
       } BitVariable1;

int main(int argc, char *argv[])
{
    BitVariable BV1;
    BV1.a=2;   //10
    BV1.b=8;   //1000   
    BV1.c=86;  //1010110
   
    cout<<BV1.a<<endl;  //output 2  <===> 10B 
    cout<<BV1.b<<endl;  //output 0  <===> 1000B
    cout<<BV1.c<<endl;  //output 22 <===> 10110B
    cout<<sizeof(BitVariable)<<endl; //output 8. int 32位机器占4字节。 如果将unsigned :0;去掉,则此处输出4。

system("PAUSE");
    return EXIT_SUCCESS;
}

C语言变量声明加冒号的用法相关推荐

  1. mysql变量赋值加冒号_C语言变量声明加冒号的用法(占位符)

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

  2. C语言删掉无关变量无输出,C语言变量类型与输出控制用法实例教程

    本文实例讲述了C语言变量类型与输出控制用法,有助于读者很好的对其进行总结与归纳.该实例分享给大家供大家参考借鉴之用.具体如下: 完整实例代码如下: /************************* ...

  3. C语言变量声明和定义 - C语言零基础入门教程

    目录 1.变量名的开头必须是字母或下划线,不能是数字 2.变量名中的字母是区分大小写的 3.变量名绝对不可以是 C 语言关键字 4.变量名中不能有空格 四.猜你喜欢 零基础 C/C++ 学习路线推荐 ...

  4. oracle中变量前加冒号_oracle变量的定义和使用【转】

    在程序中定义变量.常量和参数时,则必须要为它们指定PL/SQL数据类型.在编写PL/SQL程序时,可以使用标量(Scalar)类型.复合(Composite)类型.参照(Reference)类型和LO ...

  5. go语言变量声明、匿名变量

    文章目录 变量声明 匿名变量 go语言常量 变量声明 var(name string = "Tom"age int = 20sex string = "male" ...

  6. C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?

    参考网址:http://www.cnblogs.com/web-HCJ/p/4468689.html 报错信息:error C2065: 'salary' : undeclared identifie ...

  7. C语言变量前面加vol,Volitale

    例1 volatile提醒编译器它后面所定义的变量随时都有可能改变.因此编译后的程序每次须要存储或读取这个变量的时候,都会直接从变量地址中读取数据. 假设没有volatile关键字.则编译器可能优化读 ...

  8. c语言变量声明放在开头,C语言变量声明问题——变量定义一定要放在所有执行语句/语句块的最前面吗?...

    报错信息:error C2065: 'salary' : undeclared identifier #include void main(){ printf("我的成绩是100分!&quo ...

  9. C语言 变量声明和定义的区别

    变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中 ...

最新文章

  1. python第三方库中函数调用_Python学习笔记(2)——Python的函数、模块、包和库...
  2. 【Android Gradle 插件】工程根目录下 build.gradle 配置文件 ( 远程仓库配置 | 依赖配置 | 所有子模块配置 | task clean 任务 )
  3. Ubuntu 14.04 DNS 配置
  4. 在log4j中使用自定义的Appender
  5. C/C++代码优化方法
  6. java单例模式双重检查
  7. 在ASP.NET中防止注入攻击[翻译]
  8. 【Android MyEclipse】no projects are found to import 如何解决
  9. 专家看台:阿里软件研发总监叶伟:如何处理技术和需求的矛盾
  10. 常州大学移动宽带上网助手——安装包v1.4
  11. PHP生成二维码名片带LOGO并解决LOGO失真
  12. 电脑 变速 java游戏_极品飞车-变速FX版
  13. 【Fortran】STOP语句
  14. 推荐系统-协同过滤在Spark中的实现
  15. 落花人独立,微雨燕双飞——晏几道《临江仙》
  16. 解决VM虚拟机连不上网络的问题
  17. NE5532DR IC OPAMP GP 2 CIRCUIT 8SOIC
  18. 船舶事故数据处理可视化平台之搭建Python开发环境
  19. 【Java基础】从Java语言层面理解BIO,NIO,AIO(二)
  20. CStudioFile文件的输出

热门文章

  1. Bash学习系列---第2/3部分
  2. 百年不遇的,我遇到了两次
  3. 问题六十八:着色模型(shading model)(1)——反射模型(reflection model)(3.1)——辐射学(Radiometry)
  4. 硬编码是什么意思_饰品上那些编码和数字你都知道是什么意思吗?
  5. 5.7(财务应用程序:计算将来的程序)
  6. 如何提高大数据分析的效果
  7. 常见的大数据技术类型有哪些
  8. java命令行参数args_Args4J (Java 命令行参数控制开源项目) 使用指南
  9. android 二级 滚动,android使用 ScrollerView 实现 可上下滚动的分类栏实例
  10. AtCoder Beginner Contest 173 D - Chat in a Circle