#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,负面还有一个额外的数字。有关更多解释,请参见上面的链接。1001
。当您将其放入a
(有符号)中时,由于初始1,您将得到a
为负数,并且由于以下数字为001
,因此我们将最大负数加1,从而给出-7。unsigned int
,这将为您提供[0,15]
的范围。
编辑:
如果有人不明白为什么1001
带符号的结果是-7,请考虑以下内容:
由于1111
等于-1,让变量value=-1
。
要确定负(带符号)int num
的值,请将xi在num
中表示如下:
xi:{0,1},其中i=0表示最低有效位。
然后,对于每个xi=0,从value
中减去2i。
例如:
1001
:
value
= -1 - 21 - 22 = -7
a
设置为unsigned int
。你只为该字段保留了4位,其中1位用于符号,因此仅剩下3位可用于正数。因此,你只能存储最多7的值。
确实需要使用无符号 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
int
默认可能是unsigned int
。在OP的情况下似乎不是这样,但阅读文档从来没有坏处。 - Carl Norum