结构变量不会因赋值而改变

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;’ 首先,如果是
但是,为什么‘x.a3 = 1’在第二个没有变化? 它仍然是x.a3 = -1。


如果我输入‘x.a3 = 1;’ 在第一个if,它仍然是x.a3 = = 1 !! 它没有改变!

XCode中的调试结果

问题是,带符号的1位变量只能保存两个值,即-10 (读取二进制补码 )。 保持值为1 (+ 1 ,确切地说)是不够的。

在撰写作业时要详细说明

  x.a3 = 1; 

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

存储1表示为二进制补码,将产生结果-1 (根据MSB值),因此使用== 1的条件检查将始终失败。

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

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

 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"); }