int x=8;
int k=~(x);
printf(%d",k)
输出:9
对它的解释是:
8= 00000000 00000000 00000000 00001000
~8 = 11111111 11111111 11111111 11110111
我们以整数形式分配它,因此最高有效位 (MSB) 是符号位
bcz MSB 为 1,因此它被视为 -ve no。
当您尝试打印它时,然后在打印编译器之前将采用 2 的补码,因此它变成:
(~8)=9
的 2 的补码
11111111 11111111 11111111 11110111
的 2 的补码是 00000000 00000000 00000000 00001000 +1 = 1001 = 9
所以我的问题是,如果我们执行 k=-9
那么如果我们打印 k,它会打印 -9。什么时候需要 2 的补码
最佳答案
对您的问题的直接但高度技术性的回答是,当取反运算符对其进行运算时,取二进制补码作为整数值。
更通俗地说:整数的补码与其取反完全相同。
如果你写
-9
您得到 9
的二进制补码,即 -9
。如果你写
-(-9)
您得到 -9
的二进制补码,即 9
。
由于您在问题中提到波浪号运算符 (~
),让我们看一下。波浪号运算符是一个的补充,这是您“翻转每一位”时得到的结果。注意:
~(-3) = 2
~(-2) = 1
~(-1) = 0
~0 = -1
~1 = -2
~2 = -3
总的来说
~x = -x - 1
它们是不同的。使用-
表示补码,使用~
表示补码。
许多人喜欢将其重写为
-x = ~x + 1
这给出了有关如何设计否定电路的提示。它的意思是“要找到一个数的负数(即它的二进制补码),你翻转每一位然后加 1”。
关于c - 数的否定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21037870/