在实际接触的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的整数倍。然后才考虑实际每个字节里面具体位域分布(关于结构体的内存对齐感兴趣的可以自行了解)。


  1. 参考地址:https://www.cnblogs.com/maowang1991/p/3656072.html ↩︎

19_09_13 关于c语言中位域的理解相关推荐

  1. 如何理解c语言的变量,C语言中变量的理解.PDF

    C语言中变量的理解 年第 期 建建 电电 脑脑 2011 3 59 C 语言中变量的理解 潘 莉 河南经贸职业学院 东校区 河南郑州 ( 冤 450009 ) 摘 要 在很多 级语言的基础语法中都有变 ...

  2. c语言中*用于指针,关于C语言中指针的理解

    关于c语言中指针的一些理解 这几天在看任哲老师编写的嵌入式实时操作系统uC/OS原理与应用一书,第二章讲到指针的用法,我发现自己有些地方有疑问,就重新看了关于c指针的知识.同时也对指针有了一定的理解. ...

  3. c语言符号错误怎么避免,C语言中常见符号问题探析

    摘 要:C语言是应用最广的高级程序设计语言,其语法灵活,使用便捷.文章在Turbo C环境下,提出几种常见的编译系统纠错无法判断的问题,分析了几种运算符.语句结束符和ELSE等,并通过案例来比较分析程 ...

  4. 理解C语言中指针的声明以及复杂声明的语法

    昨天刚把<C程序设计语言>中"指针与数组"章节读完,终于把心中的疑惑彻底解开了.现在记录下我对指针声明的理解,顺便说下如何在C语言中创建复杂声明以及读懂复杂声明. 本文 ...

  5. 理解C#语言中的类型转换----初学者的理解,请大神指教

    一下都是在视频教学中学到后的理解,如果说错了请大神指教 C#语言中的类型转换,就是将某个数据要转换成另一个类型的数据. c#语言中的数据类型主要有: char类型(字符类型): string类型(字符 ...

  6. 位域 内存 字节序_C语言中的位域、字节序、比特序、大小端(转)

    1.比特序 / 位序 / bit numbering / 我们知道一个字节有8位,也就是8个比特位.从第0位到第7位共8位.比特序就是用来描述比特位在字节中的存放顺序的.通过阅读网页的内容,关于比特序 ...

  7. c语言中b的作用是什么意思,C语言中是什么意思?ab怎么理解?

    C语言中&是什么意思?a&b怎么理解?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中& ...

  8. c语言int 转bool_深入理解C语言中的类型转换

    今日份知识更新,即<深入理解C语言中的类型转换> 文章目录: 一.隐式转换 1.1.基本类型转换 整形提升 算数转换 1.2.指针转换 二.显式转换 隐式转换 基本类型转换 整形提升 表达 ...

  9. C语言答案写成科学记数法,c语言科学记数法_C语言中、科学计数法123456e+002具体代表什么意思、或者说怎么理解这个数_淘题吧...

    『壹』 c语言用double写了一个表示科学计数法的程序,但是却读不出来30位以上的数,怎么办 double 是抄64 位(8字节),52 位代表有袭效数位,11 位表示指数,一位表示符号,精度(有效 ...

最新文章

  1. Face++印奇:从无人问津到融资4.6亿美金|纪录影片
  2. 十九、Android Activity初探
  3. python 中反斜杠在字符串过长的正确用法
  4. Python基础系列讲解——继承派生和组合的概念剖析
  5. 计算机的硬盘和光盘数,磁盘与光盘介绍-计算机组成原理与汇编语言-电子发烧友网站...
  6. LeetCode 1306. 跳跃游戏 III(广度优先搜索BFS)
  7. anaconda3 tensorflow安装踩坑记(WIN10+tensorflow带gpu版本)
  8. VC显示\关闭\销毁模态与非模态对话框技巧
  9. SharePoint 使用ECMAscript对象模型来读取帖子列表
  10. 用“看板图”实现敏捷项目的可视化
  11. linux下载git并为git配置连接ssh
  12. SOLIDWORKS软件转Dwg格式教程
  13. linux rpm 装 mac,linux之 rpm,yum
  14. pcap头文件位置 Linux,pcap文件头的组织格式
  15. Lipschitz 条件
  16. K.M.P算法个人浅谈
  17. SSO(Single Sign On)系列(二)--SSO原理
  18. mysql5.7.20 安装过程记录
  19. 深度学习目标检测方法综述
  20. 安装系统正在为首次使用计算机ghost,win7系统安装程序显示正在为首次使用计算机做准备的解决方法...

热门文章

  1. Flutter CircularProgressIndicator进度指示器/Loading
  2. 英语46级报名考试系统
  3. 深度好文,腾讯2019互联网趋势报告
  4. 只需5步——在轻量应用服务器部署Hexo博客
  5. Allegro打散Group的两种方法操作指导
  6. 软考中级哪一门比较好过?
  7. Fuchsia OS 将推送给所有第一代 Nest Hub 设备
  8. python爬取公众号阅读量_公众号没做起来,那是你菜 | 爬取21个公众号数据后
  9. PS制作文字扫描效果(仿旧效果)
  10. 【附源码】计算机毕业设计JAVA医院病历管理系统