C/C++ 位域总结
最近接触到了位域这个概念,大家都知道字节是内存寻址的最小单元,但有时我们仅需要几位的二进制空间来存储数据,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++ 位域总结相关推荐
- 怎么把位域合成一个字节_C语言中字节对齐和位域
1.1基本类型默认字节对齐和改变字节对齐方式 c语言在给不同类型变量分配地址空间时,并不是总是紧邻着上一个变量的地址空间分配的,而是它所在的地址空间,必须被它的默认对齐字节数整除.例如,int类型占4 ...
- mysql字节对齐_结构体字节对齐-位域及其对齐
字节对齐的准则:其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2) 结构体每个成员相对于结构体首地址的偏移量都是成 ...
- C语言中结构体的位域(bit-fields)
有些数据在存储时并不需要占用一个完整的字节,只需要占用一个或几个二进制位即可.例如开关只有通电和断电两种状态,用 0 和 1 表示足以,也就是用一个二进位.正是基于这种考虑,C语言又提供了一种叫做位域 ...
- C++知识点杂记3——局部类、位域、volatile、链接指示、枚举、定位new
一.局部类 局部类就是定义在函数内部的类,因为作用域只是在函数内部,所以,所有成员定义必须完整,在Qt的源码中有几处使用了局部类,见博客https://blog.csdn.net/Master_Cui ...
- C 语言编程 — 高级数据类型 — 结构体与位域
目录 文章目录 目录 前文列表 结构体 定义结构体 初始化结构体变量 访问结构体成员 结构体的内存分布 将结构体作为实参传入函数 指向结构体变量的指针 位域 定义位域 使用位域结构体的成员 前文列表 ...
- 位域(bit fields)简介
位域(bit fields)简介 1.简介 位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存 ...
- C++ Primer 5th笔记(chap 19 特殊工具与技术)两种不可移植的特性之“位域”
两种不可移植的特性: 位域和 volatile 1. 位域 ( bit-field ) 类可以将其( 非静态) 数据成员定义成位域 , 在一个位域中含有一定数量的二进制位. 位域的类型必须是整型或枚举 ...
- C语言中的位域 bit field [转]
一.位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位 ...
- volatile,可变参数,memset,内联函数,宽字符窄字符,国际化,条件编译,预处理命令,define中##和#的区别,文件缓冲,位域
1.volatile:要求参数修改每次都从内存中的读取.这种情况要比普通运行的变量需要的时间长. #include <stdio.h> #include <stdlib.h&g ...
- C# 位域[flags]
.NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,例如: [Flags] enu ...
最新文章
- 页面怎么创建一个数组_怎么创建一个企业网站?
- 为什么要学python语言、学完有什么好处_学编程为什么首选Python?学完Python的优势有哪些?...
- python map用法_讲解Python map()函数和将map()与多个Iterables一起使用
- Linux下使用rsync同步文件
- 首次面试凭借Java面试通关宝典,成功逆袭拿下美团offer
- 推荐4个爬虫抓包神器
- armbian编译安装mentohust 认证锐捷客户端
- 【手把手教你】使用QuantLib进行债券估值和期权定价分析
- android前置摄像头预览,android - 当选择了前置摄像头CameraX预览没有显示任何东西 - 堆栈内存溢出...
- 深度学习笔记:01快速构建一个手写数字识别系统以及张量的概念
- 智慧交通,迎来产业谍战丨产业特稿
- 关于宏的bypass学习
- 用vue-cli创建项目后npm run serve 报错Component name “main“ should always be multi-word vue/multi-word-compo
- 最老程序员创业开发实训2---采用MVC架构的应用Splash页面实现
- http中get/put/post区别
- APP在电脑模拟器上完美运行,真机运行时闪退现象记录
- Day 22 学习分享 - 泛型和学生管理系统项目进阶
- java:使用supervisor优雅的管理SpringBoot进程
- 第三章 卡耐基如何战胜自我 一 驱逐烦恼的技巧
- SpringCloud- Ribbon 负载均衡 轮训算法
热门文章
- Python入门--集合元素的判断(in,not in集合元素的增加(add()update())集合元素的删除(remove(),discard(),pop(),clear())遍历(for in)
- POJ 2352 HDU1541 Stars(树状数组)
- c语言指数怎么表示_Assembly 浮点表示法
- 1500ml等于多少l_发动机1.5T、2.0T大概等于多少L?涡轮增压就一定比自然吸气好?...
- Android Studio 安装遇到问题及解决方法
- C#基础9:虚函数与多态
- k8s prometheus/grafana 监控系统建设
- java中的文件操作:读取写入byte[]字节流、string字符串、list列表
- python 以行为单位进行字符串的切割
- 7.25 8figting!