关于C位域的问题

前端之家收集整理的这篇文章主要介绍了关于C位域的问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
> 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位对齐中.

猜你在找的C&C++相关文章