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
这似乎不大于-12并且是+ ve。但是我怎么把o / p作为-12?
答案 0 :(得分:2)
要找到负整数的二进制补码,首先要找到其大小的二进制表示。然后翻转其所有位,即应用按位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
的相应位进行操作,并且仅当位不是1
或0
时才评估为1
,否则它将评估为0
。
答案 1 :(得分:2)
似乎合法!
1111 1110 (-2)
xor
0000 1010 (10)
=
1111 0100 (-12)
答案 2 :(得分:1)
^
是按位xor,而不是幂
a = 10 = 0000 1010
b = -2 = 1111 1110
__________________
a^b = 1111 0100 = -12
答案 3 :(得分:0)
(int) -2 = 0xfffffffe
(int) 10 = 0x0000000a
0xfffffffe ^ 0x0000000a = fffffff4 = (int) -12