web-dev-qa-db-ja.com

2バイトを追加してintを取得できず、2バイトを追加して1バイトを取得できないのはなぜですか?

public class Java{
    public static void main(String[] args){
        final byte x = 1;
        final byte y = 2;
        byte z = x + y;//ok
        System.out.println(z);

        byte a = 1;
        byte b = 2;
        byte c = a + b; //Compiler error
        System.out.println(c);
    }
}

2バイトの合計が1バイトに収まる場合でも、intサイズ以下のものが含まれる式の結果が常にintである場合。

1バイトに収まる2つの最終バイトを追加するとどうして起こるのですか?コンパイラエラーはありません。

28
Joe

JLS 5.2割り当て変換から

さらに、式がbyte、short、char、またはint型の定数式(§15.28)の場合:-縮小プリミティブ変換は、変数のタイプがバイト、ショート、またはチャーであり、定数式の値が変数のタイプで表現できる場合に使用されます。

つまり、式の値(定数式なのでコンパイル時に認識されます)は、バイトである変数の型で表現できます。

あなたの表現を考えて

 final byte x = 1;
 final byte y = 2;
 byte z = x + y;//This is constant expression and value is known at compile time

そのため、合計がバイトに収まるため、コンパイルエラーは発生しません。

今なら

final byte x = 100;
final byte y = 100;
byte z = x + y;// Compilation error it no longer fits in byte
30
Amit Deshpande
byte z = x + y;  // x and y are declared final

ここでは、xyfinalとして宣言されているため、RHSの式の値はコンパイル時にわかり、(1 + 2 = 3)と変化させることはできません。したがって、明示的に型キャストする必要はありません

byte c = a + b;   // a and b are not declared final

一方、この場合、abの値は最終的に宣言されていません。したがって、式の値はコンパイル時には不明であり、実行時に評価されます。したがって、明示的なキャストを行う必要があります。


ただし、1番目のコードでも、a + bが範囲外であることが判明しました-128 to 127、コンパイルに失敗します。

final byte b = 121;
final byte a = 120;
byte x = a + b;  // This won't compile, as `241` is outside the range of `byte`

final byte b1 = 12;
final byte a1 = 12;
byte x1 = a1 + b1;  // Will Compile. byte can accommodate `24`
9
Rohit Jain