问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

struct定义中在成员后面加冒号“:1”是什么意思?

发布网友 发布时间:2022-05-30 23:11

我来回答

2个回答

热心网友 时间:2024-11-07 22:32

这是位域操作的表示方法,也就是说后面加上“:1”的意思是这个成员的大小占所定义类型的1 bit,“:2”占2 bit,依次类推。当然大小不能超过所定义类型包含的总bit数。
一个bytes(字节)是8 bit(bit)。例如你的结构中定义的类型是u_char,一个字节,共8bit,最大就不能超过8。
32位机下,
short是2字节,共16bit,最大就不能超过16.
int是4字节,共32bit,最大就不能超过32.
依次类推。

这样定义比较省空间。例如你上面的结构,定义的变量类型是u_char,是一字节类型,即8bit。
fc_subtype占了4bit,fc_type占2bit,fc_protocol_version占2bit,共8bit,正好是一个字节。
其他八个成员,各占1bit,共8bit,正好也是一个字节。
因此你的结构的大小如果用sizeof(struct frame_control)计算,就是2bytes.

热心网友 时间:2024-11-07 22:32

位域
有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。
一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:
struct 位域结构名
{ 位域列表 };
其中位域列表的形式为: 类型说明符 位域名:位域长度
例如:

struct bs
{
int a:8;
int b:2;
int c:6;
};
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:

struct bs
{
int a:8;
int b:2;
int c:6;
}data;
说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:
1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:

struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*从下一单元开始存放*/
unsigned c:4
}
在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

struct k
{
int a:1
int :2 /*该2位不能使用*/
int b:3
int c:2
};
从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。
二、位域的使用
位域的使用和结构成员的使用相同,其一般形式为: 位域变量名·位域名 位域允许用各种格式输出。

main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}
上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。
程序的9、10、11三行分别给三个位域赋值。( 应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针 方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=", 该行相当于: pbit->b=pbit->b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为 3)。同样,程序第16行中使用了复合位运算"|=", 相当于: pbit->c=pbit->c|1其结果为15。程序第17行用指针方式输出了这三个域的值。

为了节省空间,可以把几个数据压缩到少数的几个类型空间上,比如需要表示二个3位二进制的数,一个2位二进制的数,则可以用一个8位的字符表示之。
struct
{
char a : 3;
char b : 3;
char c : 2;
} ;
这个结构体所占空间为一个字节,8位。节省了空间。

参考资料:http://ke.baidu.com/view/1256879.htm

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...乙肝表面抗体和乙肝核心抗体同显阳性,其余三项为阴性说明了什么... 确认劳动关系原告可以是多人吗 华为p7_l09的时间如何调整 什么地方卖毛线 如何订购毛线 顾景舟石瓢壶多少价 ...这个日期什么格式 Java 中怎么日期 转换成这样子呢如:2013-06-27... java中用正则表达式匹配并输出的时间怎样拿到别的方法里进行计算。例... Java程序 题目:星期计算器的实现。实现要点:输入一个2013-05-01后的日... 半夜敷面膜这些星座就是这样被吓死的 struct 定义和初始化。 关于C语言struct定义的问题 C语言struct 类型数组怎麼定义? Struct数组,怎么定义好 struct用法 求问,ps4pro支持的SSD最小容量是多少的 拨号上网外地也能用吗? 本公司做小区及农村宽带运营,寻辽宁ISP资质公司挂靠。 急急《犇》这个字有认识的吗写个同音字谢了 玻纤板和环氧树脂板的区别,PCB板所采用的板是哪种?哪种板能够耐高温?没... P是Q的充分条件则P范围大还是Q的范围大 环氧树脂板和千思板的区别? 有没有呼唤神话武器名字就可以得到原来的主人到传承的小? 有没有类似于番茄小说里的神话复苏的小说推荐在哪里可以看? 华为c199麦芒怎么一键root 从学习动机的角度谈谈读大学意味着什么 上大学意味着什么 在茶中放几片柠檬茶有什么好处? 平安银行信用卡申请了半月了在网上怎么查不到申请记录,打客服就说是... 平安信用卡申请交这么久啦,为什么查不到进度? 结构体的定义 乾隆年间的李侍尧下场如何? 李侍尧是什么来头,为何犯下死罪乾隆对其网开一面? 去黄褐斑有什么好方法? 李侍尧做了这么多坏事,为什么乾隆都没有对他下手呢? 李侍尧的主要成就 黄褐斑怎么祛除 和珅受命赴云南是如何处理李侍尧贪污案的? 李待尧是什么人?是哪个朝代的?家世如何? 梦断紫禁城的演员问题,演福长安是谁?演李侍尧是谁?求大神! 急~~word 查询功能实现 2022年辽宁CPA考试时间安排是怎样的 2022辽宁cpa考试成绩查询时间是什么时候 查询功能无法使用 ipad画图软件有哪些 为什么使用win32gui.findwindowex得到的返回值为0 使用pywinauto如何 获取systreeview32内的item(python语言)_百度... 卢姓女孩起名四字分数高的 有哪些拙劣但成功过的骗局? 在NASA工作怎么样的?