#include<stdio.h>
struct a
{
int a:4;
};
main(){
struct a aa;
aa.a=9;
printf("a=%d\n",aa.a);
return 0;
}
这里的输出是-7。为什么会这样?int a:4 到底是做什么的?请解释
由于它是二进制补码,因此最高位用于符号。通过写作a:4
你说只分配 4 位内存,剩下 3 位用于实际数字。所以我们的有效范围是[-8,7]
。由于所有 1 都是 -1,因此负数有一个额外的数字。有关这方面的更多解释,请参阅上面的链接。
9、in(无符号)二进制是:1001
. 当您将其放入a
(signed) 时,您会得到a
负数,因为初始值为 1,并且由于以下数字是001
,因此我们将最大负数加 1,从而得到 -7。
如果您只想将数字 9 存储在 4 位中,则需要使用unsigned int
,这将为您提供[0, 15]
.
编辑:
如果有人正在努力弄清楚1001
签名如何给我们-7,请考虑以下几点:
因为1111
是-1,让一些变量value = -1
。
为了找出负数(有符号)的值int num
,让我们表示 x i in num
:
x i : {0,1 在位置 i,其中 i=0 是最低有效位)},
然后,对于每个 x i = 0,从中减去 2 ivalue
。
例子:
1001
:
value
= -1 - 2 1 - 2 2 = -7
您的字段是一个 4 位有符号整数。对于有符号整数,高位是符号位,这意味着实际数字只有 3 位。您可以在该字段中存储的数字范围是 -8 到 7(假设 2 的补码存储)。
9 的位模式是 1001,它设置了第 4 位,这意味着它被解释为负数,这就是它打印为 -7 的原因。如果您期望得到 -1,则需要阅读2 的恭维。
如果您希望能够在字段中存储 9,请创建a
一个unsigned int
您只为该字段保留了 4 位,一位用于符号,因此仅保留 3 位用于正值。因此,您最多只能存储 7 个值。
你必须使用unsigned确实int:
#include<stdio.h>
struct a
{
unsigned a:4; // <-- unsigned indeed int, then work good
};
main(){
struct a aa;
aa.a=9;
printf("a=%d\n",aa.a);
return 0;
}
输出 :
a=9