我对以下代码的输出有点困惑,虽然我知道这种结构的声明在C中的含义。
#include<stdio.h>
struct struc
{
int a:1;
int b:3;
int c:6;
int d:3;
}s1;
struct stru
{
char a:3;
}s2;
int main()
{
printf("%lu %lu",sizeof(s1),sizeof(s2));
getchar();
return 0;
}
我正在努力学习这种结构声明的实际工作。 任何人都可以解释代码如何将输出作为“4 1”,因为我想要正确掌握这个概念。
还有以下代码:
#include <stdio.h>
struct marks{
int p:3;
int c:3;
int m:2;
};
int main(void) {
struct marks s={2,-6,5};
printf("%d %d %d",s.p,s.c,s.m);
return 0;
}
该程序的输出应该是什么?
答案 0 :(得分:5)
您展示的代码正在使用bit fields。简而言之,:n
成员之后的struct
限制此成员仅使用n
位,并且当相邻成员具有相同的类型时,此类成员被“打包”在一起
很久以前,这对于节省内存有时很有用 - 现在,可能需要在非常低级别的硬件接口代码中使用它,但这可能与它有关。
这里会发生什么:
struct struc
{
int a:1;
int b:3;
int c:6;
int d:3;
}s1;
此结构只有1 + 3 + 6 + 3 = 13
位信息。假设您的实现使用32位int
而char
有8位,sizeof int
为4
(32 / 8
),这仍然足以存储所有你们这里的成员。所以整个结构的大小仍然只有4
。
请注意,所有这些都是实现定义 - 它取决于char
和int
的大小,编译器仍然可以根据需要自由添加填充。所以使用位域需要你知道你的实现究竟在做什么,至少如果你需要依赖于大小和位的确切布局。
答案 1 :(得分:-1)
在示例中,我们可以看到第一个struct使用int,第二个struct使用char。
char给出1的大小结果。我认为这是预期的。
如果我们看一下变量的大小: cpp reference - types 然后我们可以看到int可以占用16位或32位。
由于结构的大小为4,我们可以确定您的编译器对此存储使用32位。