48

C#で私はそれを見る

-1 * int.MinValue == int.MinValue

これはバグですか?検索ツリーを実装しようとしていたとき、それは本当に私を台無しにしました。(int.MinValue + 1)ちゃんと無効化できるように使ってしまった。

4

5 に答える 5

60

これはバグではありません。

int.MinValue * -1保持できるよりも1大きいです。int.MaxValueしたがって、数値は に戻りint.MinValueます。

これは基本的に整数オーバーフローが原因です。

Int32.MinValue:

この定数の値は-2,147,483,648

Int32.MaxValue:

この定数の値は2,147,483,647

したがって、-2,147,483,648 * -1 = 2,147,483,648これは1より大きいですInt32.MaxValue

于 2010-09-01T21:43:09.617 に答える
9

これはバグではなく、オーバーフローです。

2の補数表現では、表現可能な数の空間は対称ではありません。最小の整数の逆は表現できません。それを計算するとオーバーフローし、同じ数値が再び得られます。

于 2010-09-01T21:43:57.097 に答える
8
int i = -1 * int.MinValue;

チェックを無効にしない限り、これはコンパイルさえしません。

error CS0220: The operation overflows at compile time in checked mode
于 2010-09-01T21:44:04.813 に答える
2

その上にチェックされた領域を置き、「バグ」が例外に発展するのを見てください。または、VB.NET を試してください (私が思い出す限り、C# とは異なり、デフォルトでチェックされています)。

于 2010-11-05T23:51:59.053 に答える
2

いいえ、バグではありません。これは、2 の補数の整数演算の性質です。

たとえば、 と の間の符号付きバイト値を考えてみましょ-128127

127(0x7f)+1 = 128(0x80). ただし、0x80実際には のバイナリ表現です-128

したがって、バイトの場合、128(0x80) = -128(0x80)

そう-128(0x80) * -1 = 128(0x80) = -128(0x80)

于 2010-09-01T21:45:36.650 に答える