#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
我不明白什么是比特场。有人可以告诉我这段代码中发生了什么吗?
答案 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。