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相加,看看你是如何得到零的:-)可能的重复