intの最大値を計算しようとしましたが、intにキャストされた計算値がlongにキャストされた場合よりも低い理由がわかりません。(2^31) - 1
電卓を上げたところ、値は
2_147_483_647
そして私がJavaで上昇し2^31
、控除1
するときも同じことを期待します、それはintの最大数を計算するはずです2147483647
が、そうではありません。
System.out.println(((long) Math.pow(2, 31)) - 1);
System.out.println((int) Math.pow(2, 31) - 1);
最初の計算は以下を与えます: 2_147_483_647
2番目の計算により、 2_147_483_646
あなたがしたことを分析しましょう。最初の例は
((long) Math.pow(2, 31)) - 1;
あなたが最初に計算することを、この手段Math.pow(2, 31)
どの収量を
2.147_483_648 E9
その後、にキャストしlong
ます。long
この値のための十分な場所があることに注意してください。
2_147_483_648
次に、減算1
して取得します
2_147_483_647
次に、2番目の例の機能を見てみましょう。あなたが書いた
(int) Math.pow(2, 31) - 1
これは次のように解釈されます
((int) Math.pow(2, 31)) - 1
つまり、以前と同じですが、のint
代わりにキャストを使用していlong
ます。ここで、値には十分な場所int
がないことに注意してください。int
表現できる最大のものは
2_147_483_647 // MAX_INTEGER
したがって、ここでもこの値を正確に取得できます。その後、あなたは減算1
して得る
2_147_483_646
あなたはそれを考えたと思います
(int) Math.pow(2, 31) - 1
評価する
(int) (Math.pow(2, 31) - 1)
しかし、そうではありません。これを明示的にすると、実際に
2_147_483_647
予想通り。
これについては、Java言語仕様で読むことができます。JLS§15.15単項演算子を参照してください。キャストは、減算などの演算子よりも優先されます。
これは、キャストが単項演算子であるのに対し、減算はバイナリであるからです。単項はバイナリよりも優先されます。公式ドキュメントは、したがって、概要として次の表を提供します:
+----------------------------------------------------------------+
| Operators | Precedence (top is high, bottom low) |
|-----------------------|----------------------------------------|
| postfix | expr++ expr-- |
| unary | ++expr --expr +expr -expr ~ ! |
| multiplicative | * / % |
| additive | + - |
| shift | << >> >>> |
| relational | < > <= >= instanceof |
| equality | == != |
| bitwise AND | & |
| bitwise exclusive OR | ^ |
| bitwise inclusive OR | | |
| logical AND | && |
| logical OR | || |
| ternary | ? : |
| assignment | = += -= *= /= %= &= ^= |= <<= >>= >>>= |
+----------------------------------------------------------------+
キャスティングはもちろん単項カテゴリの一部です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加