位域如何在这些C程序中正常工作?

0 c struct

我对以下代码的输出有点困惑,虽然我知道这种结构的声明在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

您显示的代码是使用位字段.简而言之,:nstruct成员限制此成员仅使用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编译器仍然可以根据需要自由添加填充.因此,使用位域需要您知道您的实现到底在做什么,至少如果您需要依赖于大小和位的确切布局.