Почему я не могу добавить два байта и получить целое число, и я могу добавить два последних байта, чтобы получить байт?

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);
    }
}

Если результат выражения, включающего что-либо int-size или меньший, всегда является int, даже если сумма байтов помещается в байте.

Почему это происходит, когда мы добавляем два последних байта, которые помещаются в байт? Нет ошибки компилятора.

Ответы на вопрос(2)

byte z = x + y;  // x and y are declared final

Здесь, так какx а такжеy объявлены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`
 Aubin27 окт. 2012 г., 14:07
Что добавится, если x = 120 и y = 120?
 Rohit Jain27 окт. 2012 г., 14:07
@ Обин. В таком случае это не получится. Потому что 240 не может быть размещено в байтах.
Решение Вопроса

Из преобразования назначения JLS 5.2

К тому же,если выражение является константным выражением (§15.28) типа byte, short, char или int: - Может использоваться сужающее примитивное преобразование, если тип переменной - byte, short или char, а значение константного выражения представлено в типе переменной.

Короче говоря, значение выражения (которое известно во время компиляции, потому что оно является константным выражением) представимо в типе переменной, которая является байтом.

Посмотрите на ваше выражение

 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
 Rajesh06 дек. 2017 г., 06:31
Но добавление двух типов int разрешено. Даже в случае типов int переполнение может произойти, верно? Почему поведение отличается от типов int и byte?
 Duncan Jones27 окт. 2012 г., 14:09
Итак, в итоге, OP не видит ошибки, потому что он, к счастью, выбрал значения, которые будут суммироваться, чтобы уместиться в байте.
 Amit Deshpande27 окт. 2012 г., 14:18
@Aubin Спасибо Добавлено краткое и подробное описание

Ваш ответ на вопрос