否定一个数字

deb*_*air 3 c bit-manipulation

int x=8; 
int k=~(x); 

printf(%d",k) 
Run Code Online (Sandbox Code Playgroud)

输出:9

对它的解释是:

8= 00000000 00000000 00000000 00001000 
~8 = 11111111 11111111 11111111 11110111 
Run Code Online (Sandbox Code Playgroud)

我们用整数分配它,因此最高有效位(MSB)是符号位bcz MSB是1因此它被视为-ve no.当你尝试打印它然后在打印之前编译器将采用2的补码因此它变为:2的补码是(~8)=9 2的补码11111111 11111111 11111111 1111011100000000 00000000 00000000 00001000 +1 = 1001 = 9

所以我的问题是,如果我们这样做,k=-9如果我们打印k,它将打印-9.什么时候需要2的补充

Ray*_*oal 7

对你的问题的直接但高度技术性的答案是,当由否定运算符操作时,二进制补码用于整数值.

更非正式地说:整数的二进制补码与它的否定完全相同.

如果你写

-9
Run Code Online (Sandbox Code Playgroud)

你得到的二进制补码9-9.如果你写

-(-9)
Run Code Online (Sandbox Code Playgroud)

你得到的二进制补码-99.

既然你~在问题中提到了波浪号运算符(),那就让我们来看看吧.代字号操作符是一个补码,这是你"翻转每一点"时得到的.注意:

~(-3) = 2
~(-2) = 1
~(-1) = 0
~0 = -1
~1 = -2
~2 = -3
Run Code Online (Sandbox Code Playgroud)

一般来说

~x = -x - 1
Run Code Online (Sandbox Code Playgroud)

他们是不同的.使用-两的补充和~一补.

很多人都喜欢把它重写为

-x = ~x + 1
Run Code Online (Sandbox Code Playgroud)

这提示了如何设计一个否定电路.它意味着"找到一个数字的否定(即它的两个补码),你翻转每一位然后加1 ".