C 在结构中使用int位 #包括 结构a { INTA:4; }; main(){ 结构a aa; aa.a=9; printf(“a=%d\n”,aa.a); 返回0; }

C 在结构中使用int位 #包括 结构a { INTA:4; }; main(){ 结构a aa; aa.a=9; printf(“a=%d\n”,aa.a); 返回0; },c,struct,C,Struct,这里的输出是-7。为什么会这样? INTA:4到底是做什么的?请解释您只为字段保留了4位,一位用于符号,因此只有3位用于正值。因此,最多只能存储7个值。您的字段是一个4位有符号整数。对于有符号整数,高位是符号位,这意味着实际数字只有3位。您可以在字段中存储的数字范围为-8到7(假设2的互补存储) 9的位模式是1001,它设置了第4位,这意味着它被解释为负数,这就是为什么它被打印为-7。如果你期望a-1,你需要仔细阅读 如果希望能够在字段中存储9,请将a设为unsigned int,因为它是,最高

这里的输出是-7。为什么会这样?
INTA:4到底是做什么的?请解释

您只为字段保留了4位,一位用于符号,因此只有3位用于正值。因此,最多只能存储7个值。

您的字段是一个4位有符号整数。对于有符号整数,高位是符号位,这意味着实际数字只有3位。您可以在字段中存储的数字范围为-8到7(假设2的互补存储)

9的位模式是1001,它设置了第4位,这意味着它被解释为负数,这就是为什么它被打印为-7。如果你期望a-1,你需要仔细阅读

如果希望能够在字段中存储9,请将
a
设为
unsigned int

,因为它是,最高阶位用于符号。写
a:4
就是说只分配4位内存,剩下3位作为实际数字。所以我们的有效范围是
[-8,7]
。因为所有的1都是-1,所以在负的一侧有一个额外的数字。有关这方面的更多解释,请参阅上面的链接

9,在(无符号)二进制中是:
1001
。当您将其放入
a
(签名)中时,您会发现
a
是负数,因为首字母是1,并且由于以下数字是
001
,我们在最大负数上加1,从而得到-7

如果只想将数字9存储为4位,则需要使用
无符号int
,这将为您提供一个
[0,15]
范围

编辑:
万一有人正在努力解决<代码> 1001 >代码>给我们的问题- 7,考虑以下内容:

因为
1111
是-1,所以让一些变量
value=-1

求出负值(符号)<代码> int num <代码>,让我们表示席在<代码> Num < /C> >:

xi:{0,1在位置i,其中i=0是最低有效位)}

那么,对于每一个席=0,从<代码>值< /C> >减去2i。< /P> 例如:

1001


value
=-1-21-22=-7

您必须使用无符号确实int

   #include<stdio.h>
   struct a
   {
      int a:4;
   };
   main(){
   struct a aa;
   aa.a=9;
   printf("a=%d\n",aa.a);
   return 0;
   }

你能解释一下使用二进制表示法吗?@RajaNarayan检查我的答案。默认情况下,位字段中的
int
可能是
无符号int
。这似乎不是OP的情况,但阅读文档不会有任何伤害。很好的问题和很好的答案!我验证了无符号类型将给出预期的答案。@user1930928谢谢。:)我更喜欢将MSB的值设为-2^3+2^0——这样所有非MSB都有它们通常的值。是的,这就是我在编辑之前的想法,但我也想展示一个替代方案。
#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