【问题标题】:Not understanding output related to bitfields不理解与位域相关的输出
【发布时间】:2013-08-30 12:05:54
【问题描述】:
#include<stdio.h>
int main()
{
    struct value
    {
    int bit1:1;
    int bit3:4;
    int bit4:4;
    }bit={1,8,15};
    printf("%d%d%d",bit.bit1,bit.bit3,bit.bit4);
    return 0;
}

输出为:-1-8-1

我知道这是因为无符号位,但请向我解释一下。不明白为什么 8 打印 -8 以及为什么 15 打印 -1。

【问题讨论】:

标签: c


【解决方案1】:
int bit4:4;

已签名,因此范围为 [-8..7]。将其设置为 15 相当于 0b1111。假设 2s complement 相当于 -1。

对于bit3,8 等价于 0b1000。最高位告诉您这是一个负值。反转其他位然后加 1 得到 -8。

如果要存储值 [8..15],则需要 5 位有符号值或将类型更改为 unsigned int

【讨论】:

  • int bit4:4; 定义有符号位域还是无符号位域是实现定义的(在 OP 的特定情况下,它是明确有符号的)。如果你想要有符号位域,写signed int bit4:4;C99 6.7.2:5
【解决方案2】:

四位,十六位组合为interpreted,如下:

0000 : 0
0001 : 1
0010 : 2
0011 : 3
0100 : 4
0101 : 5
0110 : 6
0111 : 7
1000 : -8
1001 : -7
1010 : -6
1011 : -5
1100 : -4
1101 : -3
1110 : -2
1111 : -1

您设置的数字对应于0001 (1)、1000 (-8) 和1111 (-1)。

【讨论】:

  • OP,仅供参考,闪烁的灯只是解释了 2s 补码,没有说。我指出它是因为当我开始时它让我很困惑......
  • @JimR 这就是我在顶部添加链接的原因:)
猜你喜欢
  • 2018-06-13
  • 1970-01-01
  • 2017-08-05
  • 2020-12-15
  • 2012-01-07
  • 1970-01-01
  • 2014-06-26
  • 2018-07-07
  • 1970-01-01
相关资源
最近更新 更多