19_09_13 关于c语言中位域的理解
在实际接触的C语言项目中,我们会发现很多时候都用到了位域。初次听到时可能有些模糊,但其实是很好理解的,以下是经过参考各类资料和大牛的说法后本人对位域的一些理解。
如有问题,欢迎告知,感谢之至。
1.什么是位域?
简单的理解,就是“按位存储”。
实际在c语言中,不同的编译器下,我们对各种类型的变量进行不同字节的存储。百度百科对字节是这么说明的:最常用的字节是八位的字节,即它包含八位的二进制数。(有兴趣的小伙伴们可以自行了解)。这里可简单理解为基本上每个字节都是占8位。
但是有时候我们所需要使用的位数并不需要那么多,比如:开关变量我们设置开为1,关为0,其实只要用一位二进制位就能够实现。因此为了节约存储空间和使处理起来方便。我们便把一个字节分开来,形成不同大小的位域,每个位域有一个域名。这样就可以实现将不同的对象用一个字节来存储。
2.怎么定义位域?
位域的定义类似于结构体的定义(好几种,可参考结构体的定义及声明)。
结构体的一种定义形式为:
struct 结构体名
{
结构体成员列表;
};
类似于此,位域也可定义为:
struct 位域名
{
位域列表;
};
位域列表的定义形式为:
类型说明符 位域名:位域长度;
需要注意的是,位域名后面用“:”(冒号)
3.一个字节中各个位域的位置顺序?
即我们在同一个字节里定义位域的时候,是按照从低到高位,还是从高到低位来存储的呢?我们来做一个实验。
#include<stdio.h>
union o{struct{unsigned char a1:2;unsigned char a2:2;unsigned char a3:2;unsigned char a4:2;}in;unsigned char test;}out;int main(){out.test=228; //二进制为11100100printf("a1:%d\n",out.in.a1);printf("a2:%d\n",out.in.a2);printf("a3:%d\n",out.in.a3);printf("a4:%d\n",out.in.a4);printf("size:%d\n",sizeof(out));return 0;
}
在联合体out内定义结构体in和变量test,使他们在同样内存里存储。设置无符号char型变量test值为228,其二进制数为11100100,然后分别输出:
发现对应关系如下:
进制 | a4 | a3 | a2 | a1 |
---|---|---|---|---|
十进制 | 3 | 2 | 1 | 0 |
二进制 | 11 | 10 | 01 | 00 |
也就是说,按照我们定义的顺序,再同一个字节里面,是从低位到高位开始存储的。1
4.跨字节位域的存储?
在当前字节所含位数少于我们所需要的位数时,又是怎么存储的呢?我们先来看两段段代码:
#include<stdio.h>
struct ab{unsigned char a:2;unsigned char b:4;
}aa;
;
int main(){printf("%d\n",sizeof(aa));return 0;
}
这是我们在同一个字节里未超出一个字节时,输出是:
#include<stdio.h>
struct ab{unsigned char a:2;unsigned char b:4;unsigned char c:4;}aa;
;
int main(){printf("%d\n",sizeof(aa));return 0;
}
这是超过了一个字节所含位数时,输出是:
可以发现,当当前的字节存不下时,会从下一个字节开始。且字节大小为位域中最长字节的整数倍。
为了更好理解,当我们把代码改成如下时:
#include<stdio.h>
struct aa{unsigned char a:2;unsigned char b:4;unsigned int c:4;
}aa;
int main(){printf("%d\n",sizeof(aa));return 0;
}
会出现这样的结果:
这是为什么呢?其实,与结构体类似,位域也需要遵循内存对齐的原则。我们首先考虑类型所占用的字节,总的字节大小是最大对齐数的整数倍,所以是4的整数倍。然后才考虑实际每个字节里面具体位域分布(关于结构体的内存对齐感兴趣的可以自行了解)。
参考地址:https://www.cnblogs.com/maowang1991/p/3656072.html ↩︎
19_09_13 关于c语言中位域的理解相关推荐
- 如何理解c语言的变量,C语言中变量的理解.PDF
C语言中变量的理解 年第 期 建建 电电 脑脑 2011 3 59 C 语言中变量的理解 潘 莉 河南经贸职业学院 东校区 河南郑州 ( 冤 450009 ) 摘 要 在很多 级语言的基础语法中都有变 ...
- c语言中*用于指针,关于C语言中指针的理解
关于c语言中指针的一些理解 这几天在看任哲老师编写的嵌入式实时操作系统uC/OS原理与应用一书,第二章讲到指针的用法,我发现自己有些地方有疑问,就重新看了关于c指针的知识.同时也对指针有了一定的理解. ...
- c语言符号错误怎么避免,C语言中常见符号问题探析
摘 要:C语言是应用最广的高级程序设计语言,其语法灵活,使用便捷.文章在Turbo C环境下,提出几种常见的编译系统纠错无法判断的问题,分析了几种运算符.语句结束符和ELSE等,并通过案例来比较分析程 ...
- 理解C语言中指针的声明以及复杂声明的语法
昨天刚把<C程序设计语言>中"指针与数组"章节读完,终于把心中的疑惑彻底解开了.现在记录下我对指针声明的理解,顺便说下如何在C语言中创建复杂声明以及读懂复杂声明. 本文 ...
- 理解C#语言中的类型转换----初学者的理解,请大神指教
一下都是在视频教学中学到后的理解,如果说错了请大神指教 C#语言中的类型转换,就是将某个数据要转换成另一个类型的数据. c#语言中的数据类型主要有: char类型(字符类型): string类型(字符 ...
- 位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)
1.比特序 / 位序 / bit numbering / 我们知道一个字节有8位,也就是8个比特位.从第0位到第7位共8位.比特序就是用来描述比特位在字节中的存放顺序的.通过阅读网页的内容,关于比特序 ...
- c语言中b的作用是什么意思,C语言中是什么意思?ab怎么理解?
C语言中&是什么意思?a&b怎么理解?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中& ...
- c语言int 转bool_深入理解C语言中的类型转换
今日份知识更新,即<深入理解C语言中的类型转换> 文章目录: 一.隐式转换 1.1.基本类型转换 整形提升 算数转换 1.2.指针转换 二.显式转换 隐式转换 基本类型转换 整形提升 表达 ...
- C语言答案写成科学记数法,c语言科学记数法_C语言中、科学计数法123456e+002具体代表什么意思、或者说怎么理解这个数_淘题吧...
『壹』 c语言用double写了一个表示科学计数法的程序,但是却读不出来30位以上的数,怎么办 double 是抄64 位(8字节),52 位代表有袭效数位,11 位表示指数,一位表示符号,精度(有效 ...
最新文章
- Face++印奇:从无人问津到融资4.6亿美金|纪录影片
- 十九、Android Activity初探
- python 中反斜杠在字符串过长的正确用法
- Python基础系列讲解——继承派生和组合的概念剖析
- 计算机的硬盘和光盘数,磁盘与光盘介绍-计算机组成原理与汇编语言-电子发烧友网站...
- LeetCode 1306. 跳跃游戏 III(广度优先搜索BFS)
- anaconda3 tensorflow安装踩坑记(WIN10+tensorflow带gpu版本)
- VC显示\关闭\销毁模态与非模态对话框技巧
- SharePoint 使用ECMAscript对象模型来读取帖子列表
- 用“看板图”实现敏捷项目的可视化
- linux下载git并为git配置连接ssh
- SOLIDWORKS软件转Dwg格式教程
- linux rpm 装 mac,linux之 rpm,yum
- pcap头文件位置 Linux,pcap文件头的组织格式
- Lipschitz 条件
- K.M.P算法个人浅谈
- SSO(Single Sign On)系列(二)--SSO原理
- mysql5.7.20 安装过程记录
- 深度学习目标检测方法综述
- 安装系统正在为首次使用计算机ghost,win7系统安装程序显示正在为首次使用计算机做准备的解决方法...