为啥 -3==~2 在 C#

Posted

技术标签:

【中文标题】为啥 -3==~2 在 C#【英文标题】:why -3==~2 in C#为什么 -3==~2 在 C# 【发布时间】:2011-05-27 04:31:45 【问题描述】:

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

代码:

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

输出:

equal

【问题讨论】:

Why is ~3 equal to -4 in Python? 的可能重复项 How does the bitwise complement (~) operator work?的可能重复 【参考方案1】:

因为two's complement bit-arithmetic 做到了

从***页面抄袭并扩展:

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

如您所见,所有位都被翻转,这就是 bitwise NOT operator (~) 所做的。

【讨论】:

对于那些对负数为何以这种方式表示感到好奇的人,请尝试将 -1 与 1 相加,看看您是如何得到零的 :-)【参考方案2】:

这篇 *** 帖子解释了原因:

What is the tilde (~) in the enum definition?

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

因为它使用二进制补码。

【讨论】:

【参考方案5】:

这两个运算符有很大的不同。

"~ 运算符按位执行 对其操作数进行补运算, 这具有颠倒每个 少量。位补运算符是 为 int、uint、long 和 乌龙。”

msdn

【讨论】:

【参考方案6】:

3 的补码是:

1...1101

2 的(有符号的)反码是:

1...1101

这很容易做到:

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

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

【讨论】:

以上是关于为啥 -3==~2 在 C#的主要内容,如果未能解决你的问题,请参考以下文章

为啥对 C# 数组使用“新”语法?

C#和C++的区别 计算机2级为啥不包括C#

为啥 C# 数组仍然限制在约 21 亿个元素中

为啥在 C# 的字符串中未检测到“空白”?

为啥我的程序需要两行输入,为啥我的 GPA 计算错误 c#?

调试 C# 时为啥不能更改字典键值对的计数?