![](/img/trans.png)
[英]Can someone help me explain why the following C program(system calls) has this kind of output?
[英]Can someone explain me why do we get the following output?
#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
我不明白什么是位域。 有人能告诉我这段代码发生了什么吗?
如果您为这些有符号变量的每个宽度写下一列可能的位模式,并在它们旁边使用等价的十进制数,您很快就会明白为什么会得到这些结果。 假设 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
在你的情况下si = 1;
int
值 1 是二进制 1,正如您所看到的 1 位变量,它的值为 -1。
在你的情况下sj = 2;
int
值 2 是二进制 10,正如您所看到的 2 位变量,它的值为 -2。
在你的情况下sk = 5;
int
值 5 是二进制 101,正如您所看到的 3 位变量,它的值为 -3。
然而,这只是对可能发生的情况的解释,因为分配一个超出有符号整数可表示范围的值是实现定义的行为。
我会让你自己解决这个 4 位的。 当sl = 10;
该值也在 4 位有符号变量的范围之外,即 -8 到 7。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.