为什么C语言中1 ^ -1 = -2?

时间:2017-07-18 19:23:45

标签: c bit-manipulation bitwise-operators

任何人都可以解释在下面的代码中如何执行x ^ -1。我试过但没有运气。我理解x ^ 1是如何执行的。

#include <stdio.h>
int main(void) 
{
int a=220, b=221, c=3;
printf("a^1= %d ,, a^-1= %d \n", a^1, a^-1);
printf("b^1= %d ,, b^-1= %d \n", b^1, b^-1);
printf("c^1= %d ,, c^-1= %d \n", c^1, c^-1);
return 0;
}
/* output: a^1= 221 ,, a^-1= -221
           b^1= 220 ,, b^-1= -222
           c^1= 2   ,, c^-1= -4    */

2 个答案:

答案 0 :(得分:3)

^运算符是C中的XORexclusive-or运算符。 为简化起见,请使用典型的two's-complement encoding来考虑8位有符号值。 int类型的工作方式相同。

Decimal   Binary
      1   00000001
     -1   11111111
          -------- XOR
     -2   11111110

请注意,一元运算符-的优先级高于^位运算符。

答案 1 :(得分:0)

签名 int使用Two's complement代表负数。

在int32:

中表示的

1

0000 0000 0000 0000 0000 0000 0000 0001

在int32中表示的

-1,使用了两个补码:

1111 1111 1111 1111 1111 1111 1111 1111

XOR将两个结果输入:

1111 1111 1111 1111 1111 1111 1111 1110

,对于签名int-2

表示无符号整数,即2^32 - 2