如果b = 5,为什么~b = -6?

时间:2012-10-17 08:24:05

标签: c twos-complement invert

我无法完成2次完成计算。

我知道C编译~b如果b = 5则将所有位反转为-6。但为什么呢?

int b = 101,反转所有位为010然后为2完成符号我只添加1但是变为011,即3这是错误答案。

我应该如何使用位反转运算符来计算??

类似的问题:如果a = 17,〜(~a)= 17怎么样?我们必须做两次完全计算。

7 个答案:

答案 0 :(得分:7)

实际上,这里的5通常表示在内存中(16位整数):

0000 0000 0000 0101

当您反转5时,将所有位翻转为:

1111 1111 1111 1010

实际上是十进制形式的-6。我想在你的问题中,你只是简单地翻过最后三位,实际上你必须考虑构成整数的所有位。

答案 1 :(得分:6)

b = 101 (5)的问题在于您选择的二进制数字太少了。

        binary | decimal  
~101 = 010     | ~5 = 2  
~101 + 1 = 011 | ~5 + 1 = 3

如果选择4位,您将获得预期结果:

          binary | decimal  
~0101 = 1010     | ~5 = -6  
~0101 + 1 = 1011 | ~5 + 1 = -5

只有3位,你可以用2的补码表示法编码从-4到+3的整数。 使用4位,您可以使用2的补码表示编码从-8到+7的整数。

-6被截断为2,-5被截断为3比特中的3。你需要至少4位。

正如其他人已经指出的那样,~只是反转某个值中的所有位,因此,~~17 = 17

答案 2 :(得分:3)

~b不是2补码操作。这是一个按位NOT操作。它只是反转一个数字中的每一位,因此~b不等于-b

示例:

b = 5
binary representation of b:  0000 0000 0000 0101
binary representation of ~b: 1111 1111 1111 1010
~b = -6

b = 17
binary representation of b:     0000 0000 0001 0001
binary representation of ~b:    1111 1111 1110 1110
~b = -18
binary representation of ~(~b): 0000 0000 0001 0001
~(~b) = 17

答案 3 :(得分:3)

~只是反转一个数字的所有位:

~(~a)=17 if a=17
~0...010001 = 1...101110 ( = -18 )
~1...101110 = 0...010001 ( = 17 )

你只需要添加1以防你想要否定一个数字(得到一个2-s补码),即从17中得到-17。

答案 4 :(得分:1)

~b + 1 = -b

所以:

~(~b)等于~(-b - 1)等于-(-b - 1) -1等于b

实际上,~会反转所有位,如果再次执行~,它将反转。

答案 5 :(得分:1)

  

我无法完成2次完成计算。   我知道C编译~b如果b = 5则将所有位反转为-6。但为什么呢?

因为你正在使用两个补充。你知道两个补充是什么吗?

让我们说我们有一个字节变量(signed char)。这样的变量可以具有0到127或-128到0的值。

Binary,它的工作原理如下:

0000 0000  // 0
...
0111 1111  // 127
1000 0000  // -128
1000 0001  // -127
...
1111 1111  // -1

签名号码通常用circle来描述。

如果您了解上述内容,那么您就明白为什么~1等于-2,依此类推。

如果你使用了一个补码,那么~1将是-1,因为一个补码使用一个有符号的零。对于用一个补码描述的字节,值将从0到127到-127到-0回到0。

答案 6 :(得分:0)

你将b声明为整数。这意味着b的值将以32位存储,而补码(〜)将在32位字上发生,而不是在你正在进行的最后3位上。

    int b=5 // b in binary: 0000 0000 0000 0101  
    ~b // ~b in binary: 1111 1111 1111 1010 = -6 in decimal  

最高有效位存储整数的符号(1:negetive 0:positive),因此1111 1111 1111 1010是十进制的-6。 同样:

    b=17 // 17 in binary 0000 0000 0001 0001  
    ~b // = 1111 1111 1110 1110 = -18