C语言结构体中冒号的作用——位域
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言结构体中冒号的作用——位域相关的知识,希望对你有一定的参考价值。
参考技术A 结构体中冒号是C 中的一种语法, 称为位域分配变量的所占的bit数,int一般为32bit,但如果int a,1 表示此处的a只占1bit。
冒号是位域,根据你实际需要的空间来分配,可以节省空间!
C语言 段位
C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或“位域”
在结构体中位段的定义格式为:
unsignede <成员名>:<二进制位数>;
例如:
struct bytedata{ unsigned a:2; /*位段a,占2位*/ unsigned b:6; /*位段b,占6位*/ }data;
引用结构体的位段成员同引用结构体其他类型成员一样,但应注意位段的最大取值范围不要超出二进制位数限制的范围,否则超出部分会丢失。
例如:
data.a = 2; /*正确*/
data.b = 10;/*错误,超出范围(a占2位,能容纳的最大值为3)*/
关于位段,还需要注意以下几点:
(1)位段成员的数据类型必须是unsigned.
(2)可以定义长度为0的位段。这使下一位段从下一存储单元(一个存储单元一般是两个字节)开始。例如:
struct bytedata{ unsigned a:1; unsigned b:2; unsigned:0; unsigned c:3; };
本来a、b、c应连续存放在一个存储单元中,但由于用长度0的位段将b、c隔开,现只能将a、b存放在一个存储单元中,而c另存放在下一个单元中
(3)位段不能跨单元存储,如果上一单元的剩余空间不够存储新的位段,则跳过此剩余空间,将该位段存放在下一个单元中
(4)可以定义无名位段,但其空间不能使用。
struct bytedata{ unsigned a:1; unsigned:2; /*无名位段,占2位,不能使用*/ unsigned c:3; };
(5)一个位段的长度不能大于一个存储单元的长度。
(6)不能定义位段数组。
(7)位段可以以%d、%u、%o、%x等格式输出。
(8)位段若出现在表达式中,将被系统自动转换成整型数。
位段排序:
先定义先排序
以上是关于C语言结构体中冒号的作用——位域的主要内容,如果未能解决你的问题,请参考以下文章