6
   #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 到底是做什么的?请解释

4

4 回答 4

5

由于它是二进制补码,因此最高位用于符号。通过写作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

于 2013-07-13T17:40:27.757 回答
4

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

9 的位模式是 1001,它设置了第 4 位,这意味着它被解释为负数,这就是它打印为 -7 的原因。如果您期望得到 -1,则需要阅读2 的恭维

如果您希望能够在字段中存储 9,请创建a一个unsigned int

于 2013-07-13T17:38:21.190 回答
3

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

于 2013-07-13T17:34:36.240 回答
2

你必须使用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
于 2013-07-13T17:42:11.203 回答