9

最近、いくつかのJavaコードをC#に変換しているときに、Javaのインクリメント演算子「+=」が暗黙的にLHSのタイプにキャストされることを学びました。

int i = 5;
long lng = 0xffffffffffffL;  //larger than Int.MAX_VALUE
i += lng;                    //allowed by Java (i==4), rejected by C#

と同等です:(詳細はこちら

int i = 0;
long lng = 0xffffffffffffL;
i = (int)(i + lng);

したがって、静かに大きさを失う機会を引き起こします。

C#は、コンパイル時にこれについてより良心的です。
Cannot convert source type long to target type int.

Javaで許可されている他の同様の状況はありますか?

4

1 に答える 1

4

longはfloatまたはdoubleにプロモートされる可能性があり、その結果、精度が低下します。

public static void main(String[] args) {
    float f = Long.MAX_VALUE;
    double d = Long.MAX_VALUE;

    System.out.println(Long.MAX_VALUE);
    System.out.println(f);
    System.out.println(d);

}

プリント

9223372036854775807
9.223372E18
9.223372036854776E18

ただし、C#でも同じように機能していると思います。

すでに述べた複合代入演算子を除いて、暗黙の変換によって値が変更される可能性があるすべての場合であると私は信じています。

于 2012-12-19T16:11:50.727 に答える