永发信息网

包含int a:2的这个结构体占几个字节呢?

答案:2  悬赏:70  手机版
解决时间 2021-03-10 21:48
typedef struct
{
int a:2;
int b:2;
int c:1;
}test;

我在Linux下gcc测得test占 4 个字节,感觉怎么不明白呢?
那这种有位域的结构体在内存中占用的字节数该怎么算呢?

按可是下面这个位域结构体为什么占4个字节呢?
struct test0{
int a:2;
char b:2;
};
最佳答案
说明int型是4字节呗。这样没有不理解啊,你看你的定义。 这是按位定义啊。
int a:2; a占两位
int b:2; b占两位
int c:1; c占一位

由于是int型,所以内存对齐,整个结构体就只占int型大小。(abc加起来才5位)
所以gcc测定的test是4个字节的int型啊。

补充:不明白楼主还有什么不懂。a只占两位,b也是只占两位,一个字节是8位。int是32位4个字节。a b c都是位定义,但是是int型对齐,a b c加一起一共占5位,连一个字节都不到,但是内存对齐,所以占32位4个字节。
全部回答
位域(位段) 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。 所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。 1. 位域的定义和位域变量的说明 位域定义与结构定义相仿,其形式为: 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位二进位
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
拒执罪300万有能力不还怎么判刑?
小规模纳税人都要交那些税啊?
处女膜修补手术,河南省人民医院,郑大一附院,
泰安市金田工艺美术中心这个地址在什么地方,
如何构建自我评价体系
一般厂矿及正规单位招收电工需几级电工证
【曜的读音】矅和曜一样的读音,是我糊涂了,还
大六壬准吗
捷弟汽车美容维修我想知道这个在什么地方
唐代车马与汉代车马的区别
吃排毒的东西大便不是黑色的是不是证明毒素已
可爱的鹅蛋脸适合什么气质短发
一个黄粉虫能下多少卵
我是真的真的爱你
书人英语和新东方英语哪个好
推荐资讯
鱼胶炖什么营养最好
日本JAB洗水管机比一般洗水管的机器有什么特
东京周围有什么好玩的
口袋怪兽复刻火精灵可以学什么技能
带地下室的一楼需要改下水么
南宁华普正方泊车建设管理有限公司管理办公室
听懂日语,看日漫怎么样,能看日漫会变多吗?
斗鱼能看重播吗
lt633车牌号代表什么意思
虾子能多吃吗
雪佛兰赛欧发动机故障灯亮了怎么办?
石龙路地址在什么地方,想过去办事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?