38

理解できません。出力が「等しい」理由

コード:

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

出力:

equal
4

6 に答える 6

61

2の補数のビット演算により、

ウィキペディアのページから削除して展開しました:

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

ご覧のとおり、すべてのビットが反転しています。これは、ビット単位のNOT演算子(~が行うことです。

于 2010-12-17T15:13:34.763 に答える
8

このstackoverflowの投稿は、その理由を説明しています。

列挙型の定義のチルダ(〜)は何ですか?

単項の補数演算子です。オペランドのビットを反転します。2の補数演算では、〜x == -x-1

于 2010-12-17T15:14:14.033 に答える
3

これは、符号付き整数の2の補数表現によるものです:http://en.wikipedia.org/wiki/Twos_complement

于 2010-12-17T15:13:47.793 に答える
2

2の補数を使用しているためです。

于 2010-12-17T15:14:12.340 に答える
0

これら2つの演算子には大きな違いがあります。

「〜演算子は、そのオペランドに対してビット単位の補数演算を実行します。これにより、各ビットが逆になります。ビット単位の補数演算子は、int、uint、long、およびulongに対して事前定義されています。」

msdn

于 2010-12-17T15:15:32.127 に答える
0

3の2の補数は次のとおりです。

1 ... 1101

(署名された)2の補数は次のとおりです。

1 ... 1101

簡単にできます。

1の補数:ビットを反転します。2の補数:1の補数+1。

なぜこれが便利なのですか?コンピューターは、ビットを反転して加算するだけで数値を減算できます。

于 2010-12-17T15:17:48.277 に答える