5

datatype を使用して単純な Java プログラムを作成しましたshort
プログラムは次のようになります。

class test
{
    public static void main(String arg[])
    {
        short x=1;
        short x_square=x*x;
    }
}

このプログラムはエラーをスローします:

java:6: possible loss of precision
found   : int
required: short

コンパイラはどのように見つけintますか? このプログラムには変数はありません。intすべての変数は として宣言されていshortます。

4

4 に答える 4

11

算術演算中int、Java では、いずれの型も型でない場合、整数型は常にプリミティブとして扱われlongます。小さい整数型は に昇格されint、操作の結果は になりますint。したがってx*x、型は as としてキャストされint、それを に割り当てようとしていshortます。shortこの縮小変換には、 への明示的なキャストが必要です。

short x_square=(short)(x*x);

JLS 4.2.2に従ってください

シフト演算子以外の整数演算子に long 型のオペランドが少なくとも 1 つある場合、演算は 64 ビット精度を使用して実行され、数値演算子の結果は long 型になります。もう一方のオペランドが long でない場合は、数値昇格 (§5.6) によって long 型に拡張されます (§5.1.5)。

それ以外の場合、演算は 32 ビット精度を使用して実行され、数値演算子の結果は int 型になります。いずれかのオペランドが int でない場合は、最初に数値昇格によって int 型に拡張されます。

于 2013-06-17T18:40:50.190 に答える
4

仕様から:

シフト演算子以外の整数演算子に long 型のオペランドが少なくとも 1 つある場合、演算は 64 ビット精度を使用して実行され、数値演算子の結果は long 型になります。もう一方のオペランドが long でない場合は、数値昇格 (§5.6) によって long 型に拡張されます (§5.1.5)。

それ以外の場合、演算は 32 ビット精度を使用して実行され、数値演算子の結果は int 型になります。いずれかのオペランドが int でない場合は、最初に数値昇格によって int 型に拡張されます。

short と short を足すと int になります。結果を int 型の変数に格納する場合は、キャストする必要があります。

于 2013-06-17T18:41:35.503 に答える
2

キャストしてみてください:short x_square=(short)(x*x)

于 2013-06-17T18:41:37.850 に答える