38

无法理解。为什么输出“相等”

代码:

 if (-3 == ~2)           
    Console.WriteLine("equal");
 else
    Console.WriteLine("not equal");

输出:

equal
4

6 回答 6

61

因为二进制补码位算术使它如此

从维基百科页面抄袭并扩展:

Most
Significant
Bit          6  5  4  3  2  1  0   Value
0            0  0  0  0  0  1  1   3
0            0  0  0  0  0  1  0   2
0            0  0  0  0  0  0  1   1 
0            0  0  0  0  0  0  0   0
1            1  1  1  1  1  1  1   -1
1            1  1  1  1  1  1  0   -2
1            1  1  1  1  1  0  1   -3
1            1  1  1  1  1  0  0   -4

所以你得到:

0  0  0  0  0  0  1  0  =  2
1  1  1  1  1  1  0  1  = -3

如您所见,所有位都被翻转,这就是按位非运算符 ( ~)所做的。

于 2010-12-17T15:13:34.763 回答
8

这篇 stackoverflow 帖子解释了原因:

枚举定义中的波浪号 (~) 是什么?

是一元补码运算符——它翻转其操作数的位。在二进制补码算术中,~x == -x-1

于 2010-12-17T15:14:14.033 回答
3

这是由于有符号整数的二进制补码表示:http ://en.wikipedia.org/wiki/Twos_complement

于 2010-12-17T15:13:47.793 回答
2

因为它使用二进制补码。

于 2010-12-17T15:14:12.340 回答
0

这两个运算符之间存在很大差异。

“~ 运算符对其操作数执行按位补码运算,这具有反转每个位的效果。按位补码运算符是为 int、uint、long 和 ulong 预定义的。”

微软

于 2010-12-17T15:15:32.127 回答
0

3的二进制补码是:

1...1101

2 的(有符号)反码是:

1...1101

这很容易做到:

一个补码:翻转位。二进制补码:一个补码+1。

为什么这很有用?计算机可以通过简单的位翻转和加法来减去数字。

于 2010-12-17T15:17:48.277 回答