你能解释一下int值是如何存储在C中的位域中的吗?

时间:2015-08-19 18:33:18

标签: c

#include <stdio.h>

struct marks{
    int p:4;
    int c:3;
    unsigned int m:2;
};

void main()
{
    struct marks s = {-15, 5, 3};
    printf("%d %d %d\n", s.p, s.c, s.m);
}

输出:

1 -3 3

为什么第一个值打印为1,第二个值打印为-3?

2 个答案:

答案 0 :(得分:5)

对于p,您分配4位。因此,p的有效值范围是1000B - 0111B或-8到7. -15所需的最少位数为5,二进制位数为10001B。由于您只分配了4位,因此符号位丢失,您将保留1。

对于c,您正在分配3位,其有效范围为100B - 011B或-4到3.由于5为101B且超出有效范围,因此显示为-3。

答案 1 :(得分:0)

二进制的值5是101.由于所讨论的字段是3位有符号的,并且设置了最高有效位,因此该值为负。在二进制补码表示中,它是-3。