有人可以解释一下为什么我们得到以下输出?

时间:2017-01-08 06:44:27

标签: c struct bit-fields

#include<stdio.h>
int main(void)
{
struct str
{
    int i: 1;
    int j: 2;
    int k: 3;
    int l: 4;
};

struct str s;

s.i = 1;
s.j = 2;
s.k = 5;
s.l = 10;

printf(" i: %d \n j: %d \n k: %d \n l: %d \n", s.i, s.j, s.k, s.l);

getchar();
return 0;
}

网站提供的输出:

i: 1
j: 2
k: 5
l: 10

我得到了

i :-1 
j : -2 
k : -3
l : -6

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

1 个答案:

答案 0 :(得分:2)

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

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

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。