C 有人能解释一下为什么我们会得到以下输出吗?

C 有人能解释一下为什么我们会得到以下输出吗?,c,struct,bit-fields,C,Struct,Bit Fields,我得到 我不明白什么是比特场。有人能告诉我这段代码中发生了什么吗?如果你为这些有符号变量的每个宽度写下一列可能的位模式,旁边是十进制等价物,你很快就会明白为什么会得到这些结果。假设2的补码表示,1位有符号变量有两个可能的值:-1和0。2位有符号变量存储范围为-2到1的值,依此类推 i :-1 j : -2 k : -3 l : -6 在s.i=1的情况下int值1是二进制1,正如您可以看到的1位变量,它的值为-1 在s.j=2的情况下int值2是二进制10,正如您可以看到的,对于2位变量,

我得到


我不明白什么是比特场。有人能告诉我这段代码中发生了什么吗?

如果你为这些有符号变量的每个宽度写下一列可能的位模式,旁边是十进制等价物,你很快就会明白为什么会得到这些结果。假设2的补码表示,1位有符号变量有两个可能的值:-1和0。2位有符号变量存储范围为-2到1的值,依此类推

i :-1 
j : -2 
k : -3
l : -6
s.i=1的情况下
int值1是二进制1,正如您可以看到的1位变量,它的值为-1

s.j=2的情况下
int值2是二进制10,正如您可以看到的,对于2位变量,它的值为-2

s.k=5的情况下
int值5是二进制101,如您所见,对于3位变量,它的值为-3

然而,这只是对可能发生的情况的解释,因为赋值超出有符号整数的可表示范围是实现定义的行为


我会让你自己做4位的。
s.l=10
该值也超出了4位有符号变量的范围,即-8到7。

阅读您的书或谷歌或搜索此网站以了解位字段是什么。您的结果与示例不同,因为大多数位字段的行为都没有标准化。因此,如果您希望您的代码在不同或未来的编译器上工作,“网站中给出的输出”-什么网站?
int i:1
没有任何意义,那么最好避免使用位字段。带符号的整数位字段为符号保留一位,因为您只提供了一位,所以留下了一个带符号的整数位字段,它可以是负数或正数,但没有可赎回的大小值(值没有剩余的位)。这段代码的其余部分似乎使违反所提供位(减去符号位)的最大值成为一种惯例。
我不明白什么是位字段
如果你不知道它是什么,为什么不阅读一本书和/或谷歌?所以,这不是你学习基本编程的地方
i: 1
j: 2
k: 5
l: 10
i :-1 
j : -2 
k : -3
l : -6
Bin Dec     Bin Dec     Bin Dec
011  3      01   1      0    0
010  2      00   0      1   -1
001  1      11  -1
000  0      10  -2
111 -1
110 -2
101 -3
100 -4