C语言 结构体Struct 中冒号的用法
本文有部分内容参考菜鸟教程-C 位域 。
-
关于“位域”的说明
- 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。
- 为了节省存储空间,并使处理简便,C 语言又提供了一种数据结构,称为"位域"或"位段"。
- 所谓"位域"是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。
-
结构体表现形式
struct 位域结构名 { 类型说明符 位域名: 位域长度 }位域结构体定义的变量;
-
下面开始结合例子进行说明
-
例子1
struct bit_st{ int a : 7; int b : 2; int : 5; int c : 3; }data;
-
bit_st表示位域结构体,a、b、c表示对应的位域," : "后面的值为对应位域占的位长度,data表示位域结构体定义的变量。
-
一个位域存储在同一个字节中,如一个字节所剩空间不够存放相邻下一位域时,则会从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
比如:a占7位,b占2位,那么第一字节存了a之后,剩余空间就只有1位了,不够存放b,b就要从第二个字节开始存放啦~
-
位域可以是无名位域,这时它只用来作填充或调整位置。无名的位域是不能使用的。
比如:位域b的下一个位域是无名位域,这个无名位域占了5位,这5位填 0 表示不使用,那么第二个字节的空位就剩1位,放不下位域c,所以位域c要从第三个字节开始存放啦~
-
由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。 如果最大长度大于计算机的整数字长,一些编译器可能会允许域的内存重叠,另外一些编译器可能会把大于一个域的部分存储在下一个字中。
-
位域的使用和结构成员的使用相同,其一般形式为:
比如:位域变量名.位域名
比如:位域变量名->位域名
-
给位域赋值(应注意赋值不能超过该位域的允许范围)。
比如:位域b占2位,那么它可被赋的最大值为3(即二进制的11)。
-
-
-
总结
如果看着乱可以问我~
欢迎探讨与指正 ━ (*`∀ ´ *)ノ亻!