有人可以向我解释这段代码背后的逻辑吗?

Can somebody please explain me the logic behind this code?

这是代码

#include <stdio.h>
#include <stdlib.h>

struct marks
{
    int p:3;
    int c:3;
    int m:2;
};

void main()
{
    system("clear");
    struct marks s={2,-6,5};
    printf("%d %d %d",s.p,s.c,s.m);

    return 0;
}

尤其是variable : number;s{values};以及它们之间的关系。 我是C的新手,所以请放轻松。

这是代码的输出。

在结构定义中,行 int p:3;p 定义为具有 3 位的 位字段 。此外,由于左侧的类型 (int) 是有符号的,这意味着 p 将是一个有符号的位字段。所以它可以容纳从-4到3的值。它可能在你的计算机上使用two's complement,所以位和值之间的对应关系是:

Bits of p Value
100 -4
101 -3
110 -2
111 -1
000 0
001 1
010 2
011 3

struct marks s={2,-6,5};基本上等同于下面的代码(虽然有时编译器发出的warnings/errors会有所不同):

struct marks s;
s.p = 2;
s.c = -6;
s.m = 5;

由于 cm 没有足够的位来保存此处分配给它们的值,因此您的实现必须先修改这些值,然后才能将它们存储在这些变量中。通常这是通过截断高位来完成的。所以-6(二进制11111010)当我们把它塞进一个3位字段时变成2(010),而当我们把它塞进一个2位字段时5(00000101)变成1(01)。