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

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 или меньше, всегда является int, даже если сумма двух байтов умещается в байте.

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


person Joe    schedule 27.10.2012    source источник


Ответы (3)


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

Кроме того, если выражение является константным выражением (§15.28) типа byte, short, char или int: - Можно использовать сужающее примитивное преобразование, если тип переменной 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
person Amit Deshpande    schedule 27.10.2012
comment
Таким образом, ОП не видит ошибки, потому что он, к счастью, выбрал значения, сумма которых уместилась бы в пределах байта. - person Duncan Jones; 27.10.2012
comment
@Aubin Спасибо. Добавлено краткое и подробное описание. - person Amit Deshpande; 27.10.2012
comment
Но допускается добавление двух типов int. Даже в случае типов int может произойти переполнение, верно? Почему поведение с типами int и byte отличается? - person Rajesh; 06.12.2017
comment
@Rajesh, потому что бинарная операция (+) в java возвращает целое число. Возможно, вам потребуется явно указать byte c = (byte) (a + b); или объявить эти байтовые поля окончательными. Однако оператор += выполняет приведение за вас. Скажем, если у вас есть байт a = 2, b = 3; тогда (a += b) дает вам 5, как и ожидалось, ни явное приведение, ни 'final' не требуются. - person Václav; 05.04.2020

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`
person Rohit Jain    schedule 27.10.2012
comment
Что добавляется, если x = 120 и y = 120? - person Aubin; 27.10.2012
comment
@Aubin.В этом случае это не удастся. Потому что 240 не может быть размещено в байте. - person Rohit Jain; 27.10.2012

Всякий раз, когда мы выполняем какую-либо арифметическую операцию между двумя переменными a и b, результат всегда равен

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

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

Объяснение: как описано выше max(int, тип a, тип b)

макс (целое, байт, байт)

результат имеет тип: int , найдено целое, но требуется в байтах

поэтому нам нужно требовать приведения типов к байтам

    byte a=10;
    byte b=20;
    byte c=(byte) (a+b);
person Anuj    schedule 19.08.2020
comment
не могли бы вы объяснить, почему мы должны преобразовать сумму a, b в байт как byte c=(byte) (a+b);, почему это вызывает ошибку? byte c=(a+b);? - person GD- Ganesh Deshmukh; 20.01.2021