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 11110111
是00000000 00000000 00000000 00001000 +1 = 1001 = 9
所以我的问题是,如果我们这样做,k=-9
如果我们打印k,它将打印-9.什么时候需要2的补充
对你的问题的直接但高度技术性的答案是,当由否定运算符操作时,二进制补码用于整数值.
更非正式地说:整数的二进制补码与它的否定完全相同.
如果你写
-9
Run Code Online (Sandbox Code Playgroud)
你得到的二进制补码9
是-9
.如果你写
-(-9)
Run Code Online (Sandbox Code Playgroud)
你得到的二进制补码-9
是9
.
既然你~
在问题中提到了波浪号运算符(),那就让我们来看看吧.代字号操作符是一个补码,这是你"翻转每一点"时得到的.注意:
~(-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 ".
归档时间: |
|
查看次数: |
17514 次 |
最近记录: |