有人可以向我解释这段代码背后的逻辑吗?
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;
由于 c
和 m
没有足够的位来保存此处分配给它们的值,因此您的实现必须先修改这些值,然后才能将它们存储在这些变量中。通常这是通过截断高位来完成的。所以-6(二进制11111010)当我们把它塞进一个3位字段时变成2(010),而当我们把它塞进一个2位字段时5(00000101)变成1(01)。
这是代码
#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;
由于 c
和 m
没有足够的位来保存此处分配给它们的值,因此您的实现必须先修改这些值,然后才能将它们存储在这些变量中。通常这是通过截断高位来完成的。所以-6(二进制11111010)当我们把它塞进一个3位字段时变成2(010),而当我们把它塞进一个2位字段时5(00000101)变成1(01)。