c - 数的否定

标签 c bit-manipulation

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/

相关文章:

c - 使用命令行将参数传递给主函数,但值始终为 2

c - 使用 fgets 刷新缓冲区

c - 错误 : expected ‘)’ before ‘:’ token

c++ - 如何识别共享库,其功能当前正由可执行文件执行

c++ - C 和 C++11 中系统时钟的性能

python - 检查奇数时 & 比 % 快吗?

c - 如何左对齐 32 位整数?

c++ - 按位整数连接

javascript - 找到最低的设置位

c# - C# 中最快的按位运算