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

4

2 回答 2

4
int bit4:4;

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

类似地bit3,8 等价于 0b1000。最高位告诉您这是一个负值。反转其他位然后加 1 给你 -8。

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

于 2013-08-30T12:07:48.713 回答
1

使用四位,十六位组合解释如下:

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

于 2013-08-30T12:11:05.790 回答