32
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バイトを追加すると、なぜそれが発生するのですか? コンパイラエラーはありません。

4

3 に答える 3

34

JLS5.2割り当て変換から

さらに、式がbyte、short、char、またはint型の定数式(§15.28)である場合:-変数の型がbyte、short、またはcharであり、値がbyteの場合、ナローイングプリミティブ変換を使用できます。定数式のは、変数の型で表すことができます。

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

あなたの表現を考えてください

 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
于 2012-10-27T12:06:58.177 に答える
9
byte z = x + y;  // x and y are declared final

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

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

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


ただし、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`
于 2012-10-27T12:05:32.387 に答える
2

2つの変数aとbの間で算術演算を実行しているときはいつでも、結果は常に次のようになります。

max(int, type of a, type of b)

byte a=10;
byte b=20;
byte c=a+b(C.E )

説明:上記のようにmax(int、type of a、type of b)

max(int、byte、byte)

結果のタイプは次のとおりです。int、foundはintですが、バイト単位で必要です

したがって、バイトへの型キャストを要求する必要があります

    byte a=10;
    byte b=20;
    byte c=(byte) (a+b);
于 2020-08-19T18:54:47.267 に答える