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

Nik*_*ntz 1 c twos-complement invert

我不能让2完成计算工作.

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

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

我应该如何计算位反转算子〜?

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

nic*_*hev 7

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

0000 0000 0000 0101
Run Code Online (Sandbox Code Playgroud)

反转5时,翻转所有位以获得:

1111 1111 1111 1010
Run Code Online (Sandbox Code Playgroud)

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


Ale*_*nze 6

问题b = 101 (5)是你选择了一个太少的二进制数字.

        binary | decimal  
~101 = 010     | ~5 = 2  
~101 + 1 = 011 | ~5 + 1 = 3
Run Code Online (Sandbox Code Playgroud)

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

          binary | decimal  
~0101 = 1010     | ~5 = -6  
~0101 + 1 = 1011 | ~5 + 1 = -5
Run Code Online (Sandbox Code Playgroud)

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

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

正如其他人已经指出的那样,~只需反转一个值中的所有位,所以~~17= 17.