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

时间:2017-08-06 13:44:54

标签: 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;
}

我正在努力学习这种结构声明的实际工作。 任何人都可以解释代码如何将输出作为“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;
}

该程序的输出应该是什么?

2 个答案:

答案 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位intchar有8位,sizeof int432 / 8),这仍然足以存储所有你们这里的成员。所以整个结构的大小仍然只有4

请注意,所有这些都是实现定义 - 它取决于charint的大小,编译器仍然可以根据需要自由添加填充。所以使用位域需要你知道你的实现究竟在做什么,至少如果你需要依赖于大小和位的确切布局。

答案 1 :(得分:-1)

在示例中,我们可以看到第一个struct使用int,第二个struct使用char。

char给出1的大小结果。我认为这是预期的。

如果我们看一下变量的大小: cpp reference - types 然后我们可以看到int可以占用16位或32位。

由于结构的大小为4,我们可以确定您的编译器对此存储使用32位。