加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

关于C位域的问题

发布时间:2020-12-16 04:54:46 所属栏目:百科 来源:网络整理
导读:bitfield是C概念还是C? 它只能在结构中使用吗?我们可以使用它们的其他地方有哪些? AFAIK,bitfields是特殊的结构变量,只占用指定的no.比特.它在节省内存方面很有用.我对么? 我编写了一个小程序来理解位域的使用 – 但是,我认为它没有按预期工作.我希望下
> bitfield是C概念还是C?
>它只能在结构中使用吗?我们可以使用它们的其他地方有哪些?
> AFAIK,bitfields是特殊的结构变量,只占用指定的no.比特.它在节省内存方面很有用.我对么?

我编写了一个小程序来理解位域的使用 – 但是,我认为它没有按预期工作.我希望下面结构的大小为1 4 2 = 7个字节(考虑到unsigned int的大小在我的机器上是4个字节),但令我惊讶的是,结果是12个字节(4 4 4).谁能让我知道为什么?

#include <stdio.h>

struct s{
unsigned int a:1;
unsigned int b;
unsigned int c:2;
};

int main()
{
  printf("sizeof struct s = %d bytes n",sizeof(struct s));
  return 0;
}

OUTPUT:

sizeof struct s = 12 bytes

解决方法

因为a和c不是连续的,所以它们每个都保留一个完整的int的内存空间.如果将a和c移动到一起,则struct的大小将变为8个字节.

此外,您告诉编译器您希望仅占用1位而不是1个字节.因此,即使a和c彼此相邻也应该只占3位(仍然在单个字节下),a和c的组合仍然在32位机器的内存中成为字对齐,因此占用了整整4个字节除了int b.

同样,你会发现

struct s{
unsigned int b;
short s1;
short s2;
};

占用8个字节,而

struct s{
short s1;
unsigned int b;
short s2;
};

占用12个字节,因为在后一种情况下,两个短路各自位于它们自己的32位对齐中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读