繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM