int main(){
int a = 10, b = -2;
printf("\n %d \n",a^b);
return 0;
}
该程序输出-12。我不明白怎么办。请解释一下。
0111 1110 -> 2's complement of -2
0000 1010 -> 10
---------
0111 0100
这个 no 似乎大于 -12 并且是 +ve。但我如何得到 -12 的 o/p 呢?
最佳答案
要找到负整数的补码,首先要找到其大小的二进制表示形式。然后翻转其所有位,即应用按位 NOT
运算符 !
。然后添加 1
到其中。因此,我们有
2 --> 0000 0000 0000 0010
~2 --> 1111 1111 1111 1101 // flip all the bits
~2 + 1 --> 1111 1111 1111 1110 // add 1
因此,-2
的二进制补码二进制表示为
1111 1111 1111 1110
现在,假设int
的大小为4,则a
和b
的二进制补码表示为 -
a --> 0000 0000 0000 1010 --> 10
b --> 1111 1111 1111 1110 --> -2
a^b --> 1111 1111 1111 0100 --> -12
运算符^
是按位XOR
或异或OR
运算符。如果对 a
和 b
的相应位进行运算,并且仅当这些位不都是 0
时,计算结果为 1
或两者均为 1
,否则计算结果为 0
。
关于c - 相反符号按位相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23309380/