难以理解,未签名

时间:2019-03-13 23:40:25

标签: c bitwise-operators

我在理解为什么在以下程序中c等于-61时遇到了麻烦:

   main() {
       unsigned int a = 60;     // 60 = 0011 1100   
       unsigned int b = 13;     // 13 = 0000 1101
       int c = 0;           
       c = ~a;          //-61 = 1100 0011
       printf("Line 4 - Value of c is %d\n", c );
   }

我确实了解NOT运算符如何在0011 1100上工作(解决方案为1100 0011)。但是我不确定为什么十进制数会增加1。这是从unsigned int(从a)到有符号int(从c)的某种类型的转换吗?

1 个答案:

答案 0 :(得分:2)

以二进制补码(标准带符号格式)从正数到负数的转换构成按位求反,然后加一个。

请注意,为简单起见,我使用一个带符号的字节。

So if 60 = 0011 1100
Then c   = 1100 0011 + 1
         = 1100 0100

对于有符号字节,最高有效位为负,

c = -128 + 64 + 4 = -60

您需要加1来考虑以下事实,即最高有效位是-128,而最大正数是0111 1111 =127。所有负数都有一个用于-128的1,需要偏移。

当您将0转换为-0时很容易看到。反转00000000,得到11111111,加1则返回到00000000。对1到-1执行相同操作,得到11111111-可能的最大负数。