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。但是我是如何将 o/p 设为 -12 的?
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。但是我是如何将 o/p 设为 -12 的?
要找到负整数的二进制补码,首先要找到其大小的二进制表示。然后翻转它的所有位,即应用按位运算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
如果对and的相应位进行操作,并且仅当位不是两者或两者时才b
计算为,否则计算为。1
0
1
0
似乎是合法的!
1111 1110 (-2)
xor
0000 1010 (10)
=
1111 0100 (-12)
^
是按位异或,不是幂
a = 10 = 0000 1010
b = -2 = 1111 1110
──────────────────
a^b = 1111 0100 = -12
(int) -2 = 0xfffffffe
(int) 10 = 0x0000000a
0xfffffffe ^ 0x0000000a = fffffff4 = (int) -12