-3
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 的?

4

4 回答 4

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如果对and的相应位进行操作,并且仅当位不是两者或两者时才b计算为,否则计算为。1010

于 2014-04-26T10:15:28.737 回答
2

似乎是合法的!

1111 1110   (-2)
xor
0000 1010   (10)
=
1111 0100   (-12)
于 2014-04-26T10:15:56.097 回答
1

^是按位异或,不是幂

a = 10 = 0000 1010
b = -2 = 1111 1110
──────────────────
a^b    = 1111 0100 = -12
于 2014-04-26T10:15:55.947 回答
0
(int) -2 = 0xfffffffe

(int) 10 = 0x0000000a                                  

0xfffffffe ^ 0x0000000a = fffffff4 = (int) -12
于 2014-04-26T10:15:36.940 回答