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 a:2的这个结构体占几个字节呢?
答案:2 悬赏:70 手机版
解决时间 2021-03-10 21:48
- 提问者网友:夢醒日落
- 2021-03-10 13:55
最佳答案
- 五星知识达人网友:慢性怪人
- 2021-03-10 14:50
说明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个字节。
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个字节。
全部回答
- 1楼网友:轻雾山林
- 2021-03-10 16:24
位域(位段)
有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有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位二进位
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯