C#で私はそれを見る
-1 * int.MinValue == int.MinValue
これはバグですか?検索ツリーを実装しようとしていたとき、それは本当に私を台無しにしました。(int.MinValue + 1)
ちゃんと無効化できるように使ってしまった。
C#で私はそれを見る
-1 * int.MinValue == int.MinValue
これはバグですか?検索ツリーを実装しようとしていたとき、それは本当に私を台無しにしました。(int.MinValue + 1)
ちゃんと無効化できるように使ってしまった。
これはバグではありません。
int.MinValue * -1
保持できるよりも1
大きいです。int.MaxValue
したがって、数値は に戻りint.MinValue
ます。
これは基本的に整数オーバーフローが原因です。
この定数の値は
-2,147,483,648
この定数の値は
2,147,483,647
したがって、-2,147,483,648 * -1 = 2,147,483,648
これは1
より大きいですInt32.MaxValue
。
これはバグではなく、オーバーフローです。
2の補数表現では、表現可能な数の空間は対称ではありません。最小の整数の逆は表現できません。それを計算するとオーバーフローし、同じ数値が再び得られます。
int i = -1 * int.MinValue;
チェックを無効にしない限り、これはコンパイルさえしません。
error CS0220: The operation overflows at compile time in checked mode
その上にチェックされた領域を置き、「バグ」が例外に発展するのを見てください。または、VB.NET を試してください (私が思い出す限り、C# とは異なり、デフォルトでチェックされています)。
いいえ、バグではありません。これは、2 の補数の整数演算の性質です。
たとえば、 と の間の符号付きバイト値を考えてみましょ-128
う127
。
127(0x7f)+1 = 128(0x80)
. ただし、0x80
実際には のバイナリ表現です-128
。
したがって、バイトの場合、128(0x80) = -128(0x80)
そう-128(0x80) * -1 = 128(0x80) = -128(0x80)