以下のif状態です。
if (i == -i && i != 0)
Javaでこの条件に対してどのような値iが返さtrueれますか?
私は、Javaで2の補数表記をi考慮することのそのような価値を考えることができません。
私はまた、この条件が(Javaとの関連で)持っているすべての答えを代数的に証明したいと思いますか?
-0.0もあることに注意してください== 0
if(i && i == -i)
以下のif状態です。
if (i == -i && i != 0)
Javaでこの条件に対してどのような値iが返さtrueれますか?
私は、Javaで2の補数表記をi考慮することのそのような価値を考えることができません。
私はまた、この条件が(Javaとの関連で)持っているすべての答えを代数的に証明したいと思いますか?
-0.0もあることに注意してください== 0
if(i && i == -i)
回答:
機能する唯一のint値は Integer.MIN_VALUEです。
これは、整数が2の補数の方法を使用して否定されるためです。
使用する
System.out.println(Integer.toBinaryString(Integer.MIN_VALUE));
あなたはそれが見Integer.MIN_VALUEています
10000000000000000000000000000000
負の値をとるが最初スワッピングによって行われる0と1、与えます
01111111111111111111111111111111
を追加すると1、
10000000000000000000000000000000
あなたが私が与えたリンクで見ることができるように、ウィキペディアは最も負の数の問題に言及し、それが唯一の例外であることを指定します:
2の補数で最も負の数は、唯一の例外であるため、「奇妙な数」と呼ばれることもあります。
もちろんLong.Min_Value、long変数に格納した場合と同じ現象があります。
これは、Javaのintのバイナリストレージに関する選択が原因であることに注意してください。別の(悪い)解決策は、たとえば最上位ビットを変更して他のビットを変更しないことで否定することでした。これにより、MIN_VALUEでこの問題は回避されましたが、2つの異なる0値と複雑なバイナリ演算が行われました(どのようにたとえば、増分されますか?)。
あなたが探している値はInteger.MIN_VALUEです。
私はまた、この条件が持っているすべての答えを代数的に証明したいと思います(Javaとの関連で)?
これはStack Exchangeのトピックから外れています。しかし、Java整数の定義(JLS 4.2)から始めることができます。
「整数型は、バイト、ショート、整数、およびロングで、その値は8ビット、16ビット、32ビット、および64ビットの符号付き2の補数の整数です...」
そして
「整数型の値は、次の範囲の整数です... intの場合、-2147483648から2147483647まで。
Javaの単項「-」演算子の定義(JLS 15.15.4):
「整数値の場合、否定はゼロからの減算と同じです。Javaプログラミング言語は整数の2の補数表現を使用し、2の補数の値の範囲は対称的ではないため、最大の負のintまたはlongの否定はその結果になります同じ最大負数。この場合、オーバーフローが発生しますが、例外はスローされません。すべての整数値xについて、-xは(〜x)+1と等しくなります。
i != -i)があります。その葉2つの範囲内の数字:0とInteger.MIN_VALUE。i != 0あなたの為に、MIN_VALUE残っているだけです。
これまでの回答に加えて...
合計4つの値があります
int i = Integer.MIN_VALUE;
long i = Long.MIN_VALUE;
Integer i = Integer.valueOf(Integer.MIN_VALUE);
Long i = Long.valueOf(Long.MIN_VALUE);
ラップされた値はラップ解除されるため、この式でも真になります。
注:Math.absドキュメント。
パブリック静的int abs(int a)
int値の絶対値を返します。引数が負でない場合、引数が返されます。引数が負の場合、引数の否定が返されます。
引数がInteger.MIN_VALUEの値と等しい場合、表現可能な最も負のint値である場合、結果は同じ値、つまり負になります。
そして
public static long abs(long a)
long値の絶対値を返します。引数が負でない場合、引数が返されます。引数が負の場合、引数の否定が返されます。
引数がLong.MIN_VALUEの値(最も負の表現可能なlong値)と等しい場合、結果は同じ値(負)になることに注意してください。
Math.absが負の数を返すのは驚くべきことです。これは、a)これらのケースでは-MIN_VALUEに正の値がないため、b)-オーバーフローで計算結果を実行するために発生します。
また興味深いのは、Byte.MIN_VALUE、Short.MIN_VALUEがこれを行わない理由です。これは、-がintこれらのタイプをに変更し、オーバーフローしないためです。
Character.MIN_VALUEは0なので問題ありません。
Float.MIN_VALUEとDouble.MIN_VALUEの意味は異なります。これらは、ゼロより大きい最小の表現可能な値です。したがって、それらには有効な負の値があり、それ自体ではありません。
他の人が述べたように、これはによってのみ満たされInteger.MIN_VALUEます。証明については、バイナリ以外の方がわかりやすい説明を提供させていただきます(それはまだ根ざしていますが)。
音符Integer.MIN_VALUEに等しい-2^31又は-2147483648且つInteger.MAX_VALUEに等しいです2^31-1か、2147483647。-Integer.MIN_VALUEis 2^31であり、これは(大きすぎるため)Integerには大きすぎるためMAX_VALUE、Integerオーバーフローを引き起こし、Integer.MIN_VALUE再びそれを作ります。MIN_VALUE0以外に負の同等値がない唯一の数値であるため、これを行うのは唯一の整数です。
2147483648はソースコードに次の1つの状況でのみ現れることがあります。単項マイナス演算子(JLS 3.10.1)のオペランドとして。
あまり教育的ではないかもしれませんが、考えずにこのコードを実行することができます。
for (int i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++)
{
if (i == -i && i != 0)
{
System.out.println(i);
}
}
印刷されることを確認するには
-2147483648
-2147483648
無限に:)
<