难以理解签名没有

问题描述 投票:0回答:1

我无法理解为什么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)到signed int(从c)的某种类型转换吗?

c bitwise-operators
1个回答
2
投票

在二进制补码(标准符号格式)中从正数转换为负数构成按位反转,并添加一个。

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

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

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

c = -128 + 64 + 4 = -60

您需要添加1以说明最高有效位为-128的事实,而最大正数为0111 1111 = 127.所有负数都为-1,-128需要偏移。

当您将0转换为-0时,很容易看到这一点。反转00000000,你得到11111111并且添加一个让你回到00000000.做同样的1到-1你得到11111111 - 最大可能的负数。

© www.soinside.com 2019 - 2024. All rights reserved.