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 !!它没有改变!
答案 0 :(得分:3)
问题是,签名的1
位变量只能包含两个值,-1
和0
(阅读Two's complement)。仅保留1
(+ 1
的值是不够的。
详细说明,在编写作业时
x.a3 = 1;
整数常量1
的值存储在为成员a3
保留的内存位置,但在访问变量时,根据变量的签名(可能是signed
或unsigned
,实现定义的行为,根据章节§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");
}