我对以下代码的输出有点困惑,虽然我知道这种结构的声明在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;
}
Run Code Online (Sandbox Code Playgroud)
我正在努力学习这种结构声明的实际工作.任何人都可以解释代码如何将输出作为"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;
}
Run Code Online (Sandbox Code Playgroud)
这个程序的输出应该是什么?
小智 5
您显示的代码是使用位字段.简而言之,:n在struct成员限制此成员仅使用n位之后,当相邻成员具有相同类型时,这些成员被"打包"在一起.
很久以前,这对于节省内存有时很有用 - 现在,您可能需要在非常低级的硬件接口代码中使用它,但这可能与它有关.
这里发生了什么:
struct struc
{
int a:1;
int b:3;
int c:6;
int d:3;
}s1;
Run Code Online (Sandbox Code Playgroud)
这个结构只有1 + 3 + 6 + 3 = 13一些信息.假设你的实现使用32位int而a char有8位,那么sizeof intis 4(32 / 8),这仍然足以存储你的成员的所有位.所以整个结构的大小仍然只是4.
请注意,所有这些都是实现定义的 - 它取决于和的大小,char并且int编译器仍然可以根据需要自由添加填充.因此,使用位域需要您知道您的实现到底在做什么,至少如果您需要依赖于大小和位的确切布局.