Тип продвижения Java

77
7

Я изучаю Java с книгой Герберта Шильдта: Java - Руководство для начинающих.
В этой книге появляется этот код:


// A promotion surprise!
class PromDemo{
public static void main(String args[]){
byte b;
int i;
b = 10;
i = b * b; // OK, no cast needed

b = 10;
b = (byte) (b * b); // cast needed!!

System.out.println("i and b: " + i + " " + b);
}
}


Я не понимаю, почему я должен использовать (байт) в строке:


b = (byte) (b * b);     // cast needed!!

b определяется как байт, а результат b * b равен 100, что является правильным значением для байта (-128... 127).


Спасибо.

спросил(а) 2015-06-26T18:05:00+03:00 4 года, 7 месяцев назад
1
Решение
97

JLS (5.6.2. Двоичное числовое продвижение) дает правила о объединении числовых типов с двоичным оператором, например, оператор умножения ( *):


    Если любой из операндов имеет тип double, другой будет преобразован в double. В противном случае, если любой из операндов имеет тип float, другой будет преобразован в float. В противном случае, если любой из операндов имеет тип long, другой будет преобразован в длинный. В противном случае оба операнда будут преобразованы в int.

Последняя точка применяется к вашей ситуации, байты преобразуются в int и затем умножаются.

ответил(а) 2015-06-26T18:12:00+03:00 4 года, 7 месяцев назад
68

В Java байт и короткий всегда будут повышаться до int, когда у вас есть такой расчет:


byte b = 10;
b = (byte) (b * b);

Итак, вы на самом деле умножаете целое число с целым числом, которое возвращает целое число. Поскольку вы не можете назначить целое число байту, вам нужно сделать бросок.


Это называется "автоматическое продвижение по типу", если вы хотите использовать его в Google (например, https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2)

ответил(а) 2015-06-26T18:10:00+03:00 4 года, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема