结构变量不会因作业

时间:2017-04-17 13:47:40

标签: c struct signed bit-fields twos-complement

struct st  
{  
    int a1 : 3;  
    int a2 : 2;  
    int a3 : 1;  
}

void main(void)
{
    x.a3 = -1;  

    if (x.a3 == -1) printf("TRUE\n");
    else printf("FALSE\n");

    x.a3 = 1;  
    if (x.a3 == 1) printf("TRUE\n");
    else printf("FALSE\n");  
}

如果' x.a3 = -1;' 首先如果 TRUE
但是,为什么' x.a3 = 1' 在第二次没有变化?它仍然是x.a3 = -1。


如果我首先输入' x.a3 = 1;' ,那么它仍然是x.a3 = = 1 !!它没有改变!

Debug Result in XCode

3 个答案:

答案 0 :(得分:3)

问题是,签名的1位变量只能包含两个值,-10(阅读Two's complement)。仅保留1(+ 1的值是不够的。

详细说明,在编写作业时

 x.a3 = 1;

整数常量1的值存储在为成员a3保留的内存位置,但在访问变量时,根据变量的签名(可能是signedunsigned,实现定义的行为,根据章节§6.7.2/ P5),将从内存中读取表示。

存储的1在二进制补码中的表示将产生结果-1(根据MSB值),因此使用{{1进行条件检查永远都会失败。

答案 1 :(得分:0)

因为字段a3是1位int(因此签名),所以它只能保存值0(如果该位为0)或-1(如果该位,则为符号位,是1)。因此,当您尝试分配值1时,将存储该值的表示形式,并且给定数据类型中的表示形式为-1。

仅仅因为1位int中的值-1与1位unsigned int中的值1具有相同的表示,并不意味着它们与同一事物相比。< / p>

答案 2 :(得分:0)

int a3 : 1;  

是一个带有位字段的结构,它定义了用于存储var的空间。你正在使a1成为一个有点符号的int,它只能保存值-1和0.如果你想让a3保持值1,那么你可能想要的语法是int a3 = 1然后是多种方式之一这样做可能看起来像这样

struct st  
{  
    int a1 : 3;  
    int a2 : 2;  
    int a3 : 1;  
};


void main(void)
{
    struct st x = {1,2,3};
    x.a3 = -1;  

    if (x.a3 == -1) printf("TRUE\n");
    else printf("FALSE\n");

    x.a3 = 1;  
    if (x.a3 == 1) printf("TRUE\n");
    else printf("FALSE\n");  
}