结构变量不会因赋值而改变
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
位变量只能保存两个值,即-1
和0
(读取二进制补码 )。 保持值为1
(+ 1
,确切地说)是不够的。
在撰写作业时要详细说明
x.a3 = 1;
整数常量1
值存储在为成员a3
保留的内存位置,但在访问变量时,根据变量的signed
(可能是有signed
或unsigned
,实现定义的行为,按照章节§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"); }