C# 为什么C中的-3==~2#

C# 为什么C中的-3==~2#,c#,.net,conditional-statements,bitwise-operators,twos-complement,C#,.net,Conditional Statements,Bitwise Operators,Twos Complement,无法理解。为什么产出“相等” 代码: if (-3 == ~2) Console.WriteLine("equal"); else Console.WriteLine("not equal"); 输出: equal 因为这样做 从维基百科页面抄袭并扩展: Most Significant Bit 6 5 4 3 2 1 0 Value 0 0 0 0 0 0 1 1 3 0

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

代码:

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

equal
因为这样做

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

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

如您所见,所有的位都被翻转,这就是所做的。

这是由于有符号整数的2的补码表示:

因为它使用2的补码。

这篇stackoverflow文章解释了为什么:

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


这两个运营商之间有很大的区别

“~运算符执行按位运算 对其操作数执行补码运算, 它的作用是逆转每一个 按位补码运算符是 为int、uint、long和 乌龙。”


这两个3的补码是:

1…1101

(签名)1的2个补码为:

1…1101

这很容易做到:

补语:倒转位。 二补:一补+1


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

对于那些好奇负数为何以这种方式表示的人,可以尝试将-1和1相加,看看你是如何得到零的:-)可能的重复