3

タイトルで質問されているように、long 値から double 値を減算すると、内部的にはどうなりますか? 型 double または long の結果であり、この動作は Java 仕様でも指定されていますか、それともこの動作は jvm 固有ですか?

だから私は自分のjvmが何をするかを自分自身でテストできることを知っています:

    public class Test {

        /**
         * @param args
         */
        public static void main(String[] args) {
        double b = 1000;
        long a = 1000;
        Object c = a - b;
        Class cls = c.getClass();  
        System.out.println("The type of the object is: " + cls.getName());
        }

    }

出力:

    The type of the object is: java.lang.Double

しかし、これはどこかに指定されていますか?それとも、私が使用したjvmに固有のものですか?

4

5 に答える 5

6

仕様の該当部分は次のとおりです。

4.2.4. 浮動小数点演算

数値演算子のオペランドの少なくとも 1 つが double 型の場合、演算は 64 ビット浮動小数点演算を使用して実行され、数値演算子の結果は double 型の値になります。もう一方のオペランドが double でない場合は、最初に数値昇格 (§5.6) によって double 型に拡張 (§5.1.5) されます。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.4

于 2013-05-28T09:05:40.363 に答える
1

ここでいくつかのことが起こっています。a - b 操作は double を生成します。これは、情報の損失に対応するためのプリミティブの拡張です。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1

次に、結果を Object 参照 (Object c = a - b;) に代入します。これにより、Double オブジェクトへのプリミティブ double のオートボクシングが生成されます。

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

于 2013-05-28T09:11:35.713 に答える
0

はい、実際、出力タイプは常に操作の左側の変数のタイプになります。コンパイラは、正しいパラメーターを変換またはキャストしようとします。可能な場合はコンパイルされますが、そうでない場合はコンパイル エラーが発生します。

于 2013-05-28T09:07:32.483 に答える