【问题标题】:Can someone explain me why do we get the following output?有人可以解释一下为什么我们会得到以下输出吗?
【发布时间】:2017-01-08 06:44:27
【问题描述】:
#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

我不明白什么是位域。有人能告诉我这段代码发生了什么吗?

【问题讨论】:

  • 阅读您的书或谷歌或搜索此站点以找出位域是什么。而且您的结果与示例不同,因为位域的大多数行为都没有标准化。因此,如果您希望您的代码在不同的或未来的编译器上工作,最好避免使用位域
  • “网站中给出的输出” - 什么网站?
  • int i:1 零意义。有符号整数位字段为符号保留位,并且由于您只提供了一位,因此您留下了一个可以为负数或正数的有符号整数位字段,但没有可赎回的幅度值(有没有为值留下位)。此代码的其余部分似乎使违反提供的位(减去符号位)中的最大值成为一种做法。
  • I don't understand what is bit field 如果您不知道它是什么,为什么不读一本书和/或谷歌呢? SO 不是您学习基本编程的地方

标签: c struct bit-fields


【解决方案1】:

如果您为这些有符号变量的每个宽度写下一列可能的位模式,并在它们旁边加上等效的十进制数,您很快就会明白为什么会得到这些结果。假设 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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2018-07-29
    • 2013-05-03
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2017-10-03
    相关资源
    最近更新 更多