最近接触到了位域这个概念,大家都知道字节是内存寻址的最小单元,但有时我们仅需要几位的二进制空间来存储数据,c语言定义了位域帮助更加接近底层,按照需求来分配空间,将1bit 分为更小的空间。

一、位域的使用方法

  1、定义

    struct 位域结构名
    { 位域列表 };
    其中位域列表的形式为: 类型说明符 位域名:位域长度

    例:

    struct test1
    {
      int ia:3;

      int ib:6;
    }bits;

    sizeof(test1) = 4, 为一个整形所占空间(操作系统为64位)

下面我通过几个例子来介绍位域的注意事项。

例1:

    struct test1
    {
      int ia:3;

      int :0;

      int ib:6;
    }bits;

    位于变量必须储存在同一字节中,不能跨两个字节,若剩余位置不够则从下一字节开始,同样可以使用int :0;使ib从下一个int单元开始(可以使用其他整形和字符型,不能使用浮点型)

    sizeof(test1) = 8

例2:

struct test2
{

char ca:3;
char :7;
char cb:6;

}bits;

sizeof(test2) =3 无名位域可用于占位。

例3:

struct test3

{

  int ia :3;

  long long lla :6;

}

sizeof(test3) = 16

位域要遵守字节对齐,即内存单元的首地址要能被基本类型成员的大小所整除。

二、位域的使用

与结构体相似:

struct
{

int ia:3;
int :7;
int ib:6;

}bits;

int main()
{

bits.ia = 3;
bits.ib = 11;
cout<<bits.ia;

return 0;

}

输出:3

PS:实际操作中编译器会对位域有所优化,例如:

struct test4
    {
      int ia:13;

      int ib:6;
    }bits;

ia位数大于8,不符合“一个位域必须存储在同一个字节中,不能跨两个字节”的规则,但实际却没有问题。

转载于:https://www.cnblogs.com/dk666/p/5969764.html

C/C++ 位域总结相关推荐

  1. 怎么把位域合成一个字节_C语言中字节对齐和位域

    1.1基本类型默认字节对齐和改变字节对齐方式 c语言在给不同类型变量分配地址空间时,并不是总是紧邻着上一个变量的地址空间分配的,而是它所在的地址空间,必须被它的默认对齐字节数整除.例如,int类型占4 ...

  2. mysql字节对齐_结构体字节对齐-位域及其对齐

    字节对齐的准则:其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2) 结构体每个成员相对于结构体首地址的偏移量都是成 ...

  3. C语言中结构体的位域(bit-fields)

    有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可.例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.正是基于这种考虑,C语言又提供了一种叫做位域 ...

  4. C++知识点杂记3——局部类、位域、volatile、链接指示、枚举、定位new

    一.局部类 局部类就是定义在函数内部的类,因为作用域只是在函数内部,所以,所有成员定义必须完整,在Qt的源码中有几处使用了局部类,见博客https://blog.csdn.net/Master_Cui ...

  5. C 语言编程 — 高级数据类型 — 结构体与位域

    目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...

  6. 位域(bit fields)简介

    位域(bit fields)简介 1.简介 位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存 ...

  7. C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“位域”

    两种不可移植的特性: 位域和 volatile 1. 位域 ( bit-field ) 类可以将其( 非静态) 数据成员定义成位域 , 在一个位域中含有一定数量的二进制位. 位域的类型必须是整型或枚举 ...

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

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

  9. volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域

     1.volatile:要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. #include <stdio.h> #include <stdlib.h&g ...

  10. C# 位域[flags]

    .NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,例如: [Flags]   enu ...

最新文章

  1. 页面怎么创建一个数组_怎么创建一个企业网站?
  2. 为什么要学python语言、学完有什么好处_学编程为什么首选Python?学完Python的优势有哪些?...
  3. python map用法_讲解Python map()函数和将map()与多个Iterables一起使用
  4. Linux下使用rsync同步文件
  5. 首次面试凭借Java面试通关宝典,成功逆袭拿下美团offer
  6. 推荐4个爬虫抓包神器
  7. armbian编译安装mentohust 认证锐捷客户端
  8. 【手把手教你】使用QuantLib进行债券估值和期权定价分析
  9. android前置摄像头预览,android - 当选择了前置摄像头CameraX预览没有显示任何东西 - 堆栈内存溢出...
  10. 深度学习笔记:01快速构建一个手写数字识别系统以及张量的概念
  11. 智慧交通,迎来产业谍战丨产业特稿
  12. 关于宏的bypass学习
  13. 用vue-cli创建项目后npm run serve 报错Component name “main“ should always be multi-word vue/multi-word-compo
  14. 最老程序员创业开发实训2---采用MVC架构的应用Splash页面实现
  15. http中get/put/post区别
  16. APP在电脑模拟器上完美运行,真机运行时闪退现象记录
  17. Day 22 学习分享 - 泛型和学生管理系统项目进阶
  18. java:使用supervisor优雅的管理SpringBoot进程
  19. 第三章 卡耐基如何战胜自我 一 驱逐烦恼的技巧
  20. SpringCloud- Ribbon 负载均衡 轮训算法

热门文章

  1. Python入门--集合元素的判断(in,not in集合元素的增加(add()update())集合元素的删除(remove(),discard(),pop(),clear())遍历(for in)
  2. POJ 2352 HDU1541 Stars(树状数组)
  3. c语言指数怎么表示_Assembly 浮点表示法
  4. 1500ml等于多少l_发动机1.5T、2.0T大概等于多少L?涡轮增压就一定比自然吸气好?...
  5. Android Studio 安装遇到问题及解决方法
  6. C#基础9:虚函数与多态
  7. k8s prometheus/grafana 监控系统建设
  8. java中的文件操作:读取写入byte[]字节流、string字符串、list列表
  9. python 以行为单位进行字符串的切割
  10. 7.25 8figting!