无法理解。为什么输出“相等”
代码:
if (-3 == ~2)
Console.WriteLine("equal");
else
Console.WriteLine("not equal");
输出:
equal
无法理解。为什么输出“相等”
代码:
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
如您所见,所有位都被翻转,这就是按位非运算符 ( ~
)所做的。
这是由于有符号整数的二进制补码表示:http ://en.wikipedia.org/wiki/Twos_complement
因为它使用二进制补码。
3的二进制补码是:
1...1101
2 的(有符号)反码是:
1...1101
这很容易做到:
一个补码:翻转位。二进制补码:一个补码+1。
为什么这很有用?计算机可以通过简单的位翻转和加法来减去数字。