一、引言

信息处理中,有些信息在存储时,并不需要占用一个完整的字节,而只需占一个或几个比特位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进制位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。
所谓“位域”是把一个字节中的比特位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。位域在本质上就是一种结构类型, 不过其成员是按二进制位分配的。

二、位域

1.位域的定义
位域是通过结构体来定义的,相比较普通的结构体,位域的成员需要明确标注其所占比特位的长度。
位域定义的基本语法如下:

struct 位域结构体名
{位域列表
};

其中位域列表的形式为:

     类型说明符  位域名 : 位域长度;

例如:

 struct BitField
{char a:8;char b:2;char c:5;
};

该结构体定义的就是位域(位段),位域a占用8个比特位,位域b占用2个比特位,位域c占用5个比特位。
位域的总长度和域变量定义的类型有关,是存储单元类型长度的倍数。
2.位域变量的定义
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明、同时定义说明、直接说明这三种方式。
例如:

struct BitField
{char a:8;char b:2;char c:5;
}weiyu;

weiyu为BitField变量,共占两个字节。
3.位域的注意事项
1)一个位域必须存储在同一个存储单元中,不能跨两个存储单元。
2)一个存储单元所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:

struct bf
{unsigned char a:4;unsigned char :0; /*空域*/unsigned char b:4; /*从下一单元开始存放*/unsigned char c:4;
};

在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。

struct bf
{unsigned  char a:5;unsigned  char b:2; unsigned  char c:4;
};
sizeof(struct bf) =  2 //该位域总长度为2个字节

3) 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

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

4)位域列表中,尽可能不要出现不同类型的域,否则,不同的编译器下得到的位域的长度将不一致。
4.位域的使用
位域的使用和结构成员的使用相同,其一般形式为:

 位域变量名·位域名

位域允许用各种格式输出。
5.位域在内存中存储模式
不同的芯片存储次序是不同的,对于Intel芯片,是按照从低位开始存储的,而对于Motolola芯片则正好相反。因此在使用不同芯片之间进行数据传输使用位域存储的数据的时候,必须知道是否是相同的芯片之间的数据传输,因为在信息的接收端要确保按照正确的次序读取相应的位域,否则将会发生不可预知的错误!!!

三、位域示例

Demo1:对某位域分别赋值,之后对位域进行不同的赋值或者位运算,并分别向屏幕输出位域。
1)参考代码

#include"stdio.h"
struct bf
{unsigned char a:1;unsigned char b:3;unsigned char c:3;
};
int main()
{bf bit, *pbit;bit.a = 1;bit.b = 7;bit.c = 2;printf(" %d,%d,%d\n",bit.a,bit.b,bit.c);pbit = &bit;pbit->a = 0;pbit->b &= 0x5;pbit->c |= 0x5;printf(" %d,%d,%d\n",pbit->a,pbit->b,pbit->c);printf( " length of bitfield : %d", sizeof( bf ) );
return 0;
}

2)第一次给位域赋值后,内存的状态


0位存储的是位域a,占1个二进制位,其值是1
1-3位存储的是位域b,占3个二进制位,其值是7
4-6位存储的是位域c,占3个二进制位,其值是2
3)运行结果

Demo2:对位域整体进行赋值,之后分别输出每个位域
1)参考代码

#include"stdio.h"
struct BF
{unsigned char a:5;unsigned char b:2;unsigned char c:4;
};
int main()
{BF *val;unsigned short aa = 1000;//1111101000val = ( struct BF * )&aa;printf(" BF.a = %d\n", val->a);printf(" BF.b = %d\n", val->b);printf(" BF.c = %d\n", val->c);return 0;
}

2)内存状态

3)运行结果

C语言之位域(位段)入门详解相关推荐

  1. C语言之#define用法入门详解

    一.#define的基本语法 在C语言中,常量是使用频率很高的一个量.常量是指在程序运行过程中,其值不能被改变的量.常量常使用#define来定义. 使用#define定义的常量也称为符号常量,可以提 ...

  2. python语言编程基础-Python语言入门详解!快速学成Python!

    原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...

  3. python语言入门m-Python语言入门详解!快速学成Python!

    今日主题 "Python语言入门详解" 近两年来,Python语言借着数据科学和人工智能的"东风"成为了最流行的编程语言--街头巷尾人们口口相传.同时,Pyth ...

  4. python语言入门详解-python初级教程:入门详解

    python初级教程:入门详解 Crifan Li 目录 前言 .................................................................... ...

  5. python语言入门-Python语言入门详解!快速学成Python!

    原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...

  6. C#语言入门详解笔记(5)—P10、P11、P12 操作符详解_1_2_3

    C#语言入门详解_哔哩哔哩_bilibiliC#语言入门详解搬运,随youtube上进度更新.刘老师的C#视频教程到30集就告一段落了,感谢刘老师在这5年间的付出.能上youtube的同学可以去刘老师 ...

  7. C#语言入门详解笔记(9)—P19 委托详解

    C#语言入门详解_哔哩哔哩_bilibiliC#语言入门详解搬运,随youtube上进度更新.刘老师的C#视频教程到30集就告一段落了,感谢刘老师在这5年间的付出.能上youtube的同学可以去刘老师 ...

  8. 【JSON】JSON入门详解(二)

    文章目录 JSON基础文章荐读 JavaScript创建JSON对象 JSON与XML的那些事 JSON与XML的相同之处 JSON与XML的不同之处 AJAX相关JSON与XML JSON与XML的 ...

  9. c语言 read 文件字节没超过数组大小时会怎样_剑指信奥 | C 语言之信奥试题详解(四)...

    趣乐博思剑指信奥系列 ❝ 趣乐博思剑指信奥系列,专门针对全国青少年信息学奥林匹克联赛 NOIP 而开展的专业教育方案.开设的课程有 C 语言基础,C++ 语言基础,算法设计入门与进阶,经典试题分析与详 ...

  10. mac电脑使用入门详解

    大家来到MAC系统以后,首先在使用习惯以及界面上,都需要有一个适应的过程,小编为大家整理了这个小白教程,有助于你快速习惯这个MAC系统. 讲个笑话: 我一朋友看到Mac界面很酷,就买了个Mac笔记本, ...

最新文章

  1. fast nms YOLACT
  2. python画图三维-对python mayavi三维绘图的实现详解
  3. python语言程序设计书-清华大学出版社-图书详情-《Python语言程序设计》
  4. asp.net 分页控件
  5. 我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!
  6. P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】
  7. 谷歌浏览器实现直接打印效果
  8. 详述Redo日志中操作系统块头信息损坏的处理过程
  9. java树的基本知识_Java数据结构和算法(二)树的基本操作
  10. Ubuntu之sshfs远程目录挂载到本地
  11. 为什么我推荐你立刻使用Java 8 Stream?性能逆天了
  12. 批量生成 Hibernate Dao
  13. 2021年安全员-B证最新解析及安全员-B证考试平台
  14. 筱筱看博客(git 冲突解决)
  15. Erlang公历转农历
  16. HTK语音识别工具包的安装和编译
  17. 什么是“ Gacha”视频游戏?
  18. 如何用html制作一个动态烟花,利用HTML5实现庆祝2018年烟花动画特效
  19. JS实现华为账号授权服务,一键登录!
  20. 2023年第一砖——IT市场的变和不变

热门文章

  1. pinyin4j 内存溢出
  2. 超牛逼的在线网站seo分析工具:Ahrefs反向链接检查
  3. 华为机试:服务器广播
  4. tcmalloc jemalloc glibc内存分配管理模块性能测试对比
  5. 大家好,我叫5G NR(转)
  6. Elastic:许可协议变更澄清
  7. VI编辑器之多文件多屏操作
  8. Spring boot 2.0 zuul routes db网关
  9. 常数变易法的原理解释
  10. 老用户梦碎!微软:骁龙 820 不支持 x86 应用