不了解与位域相关的输出

时间:2013-08-30 12:05:55

标签: c

#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。

2 个答案:

答案 0 :(得分:4)

int bit4:4;

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

类似于bit3,8相当于0b1000。顶部位告诉您这是一个负值。反转其他位然后加1会得到-8。

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

答案 1 :(得分:1)

对于4位,16位组合为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)。