私はいくつかの非常に奇妙なJavaの振る舞いを追跡しようとしていました。私はdoubleを含む式を持っていますが、整数の答えを与えることが「保証」されています。具体的には、符号なし32ビット整数です(残念ながら、Javaはうまく機能しません)。残念ながら、私の答えは時々間違っていました。
最終的に問題を見つけましたが、動作はまだ私には非常に奇妙です。aにdouble
直接キャストすると、符号付き整数int
の場合は上限があるように見えますが、aにキャストすると、期待される答えが得られます( -1;符号付き32ビット整数として表される符号なし32ビット整数のMAXINT)。MAX_INT
double
long
int
私は小さなテストプログラムを書きました:
public static void main(String[] args) {
// This is the Max Int for a 32-bit unsigned integer
double maxUIntAsDouble = 4294967295.00;
long maxUintFromDoubleAsLong = (long)maxUIntAsDouble;
long maxUintFromDoubleAsInt = (int)maxUIntAsDouble;
int formulaTest = (int) (maxUintFromDoubleAsLong * 1.0);
int testFormulaeWithDoubleCast = (int)((long) (maxUintFromDoubleAsLong * 1.0));
// This is a more-or-less random "big number"
long longUnderTest = 4123456789L;
// Max int for a 32-bit unsigned integer
long longUnderTest2 = 4294967295L;
int intFromLong = (int) longUnderTest;
int intFromLong2 = (int) longUnderTest2;
System.out.println("Long is: " + longUnderTest);
System.out.println("Translated to Int is:" + intFromLong);
System.out.println("Long 2 is: " + longUnderTest2);
System.out.println("Translated to Int is:" + intFromLong2);
System.out.println("Max UInt as Double: " + maxUIntAsDouble);
System.out.println("Max UInt from Double to Long: " + maxUintFromDoubleAsLong);
System.out.println("Max UInt from Double to Int: " + maxUintFromDoubleAsInt);
System.out.println("Formula test: " + formulaTest);
System.out.println("Formula Test with Double Cast: " + testFormulaeWithDoubleCast);
}
この小さなプログラムを実行すると、次のようになります。
Long is: 4123456789
Translated to Int is:-171510507
Long 2 is: 4294967295
Translated to Int is:-1
Max UInt as Double: 4.294967295E9
Max UInt from Double to Long: 4294967295
Max UInt from Double to Int: 2147483647
// MAX INT for an unsigned int
Formula test: 2147483647
// Binary: all 1s, which is what I expected
Formula Test with Double Cast: -1
下の2行は、私が理解しようとしている行です。ダブルキャストは私に期待される「-1」を与えます。しかし、ストレートキャストでは、32ビットの符号付き整数のMAX_INTが得られます。C ++のバックグラウンドから来ているので、予想される-1(別名「ナイーブキャスティング」)ではなく「奇数」が表示されるかどうかはわかりますが、これには戸惑います。
では、質問に対して、Javaでのこの「予想される」動作はありますか(たとえば、double
に直接キャストすると、int
に「上限」が設定されMAX_INT
ます)?キャストは予期しないタイプに対してこれを行いますか?たとえば、short
とについても同様であると思います。byte
しかし、特大のダブルをフロートにキャストするときの「予想される動作」は何ですか?
ありがとう!