#include<stdio.h>
struct a
{
int a:4;
};
main(){
struct a aa;
aa.a=9;
printf("a=%d\n",aa.a);
return 0;
}
这里的输出是-7。为什么会这样? 究竟是什么?a:4呢?请解释
答案 0 :(得分:5)
由于它是two's complement,因此最高位用于符号。通过写a:4
,你只说要分配4位内存,剩下3位留给实际数字。所以我们的有效范围是[-8,7]
。由于所有1都是-1,所以在负面有一个额外的数字。有关此问题的更多解释,请参阅上面的链接。
9,(无符号)二进制文件为:1001
。当您将其放入a
(已签名)时,由于初始值为1,因此a
为负值,并且由于以下数字为001
,因此我们将最大值加1号码,从而给我们-7。
如果您只想将数字9存储在4位中,则需要使用unsigned int
,这样可以获得[0, 15]
的范围。
修改强>
如果有人在努力弄清1001
签名给我们-7的方式,请考虑以下事项:
由于1111
为-1,请设置一些变量value = -1
。
要计算出负(签名)int num
的值,让我们在num
中表示x i :
x i :{0,1在位置i,其中i = 0是最低有效位}},
然后,对于每个x i = 0,从value
减去2 i 。
示例:
1001
:
value
= -1 - 2 1 - 2 2 = -7
答案 1 :(得分:4)
您的字段是4位有符号整数。对于有符号整数,高位是符号位,这意味着实际数字只有3位。您可以在该字段中存储的数字范围是-8到7(假设2的恭维存储)。
9的位模式是1001,它设置了第4位,这意味着它被解释为负数,这就是它打印为-7的原因。如果您预期为-1,则需要阅读2's compliment。
如果您希望能够在字段中存储9,请将a
设为unsigned int
答案 2 :(得分:3)
您只为该字段保留了4位,一位用于符号,因此只有3位保留为正值。因此,您只能存储最多7个值。
答案 3 :(得分:2)
你必须使用无符号确实 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