Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Java почему я не могу сложить i + i

Хаку Ученик (32), на голосовании 1 год назад
 byte i = 10; 
i = i + i; // 10 + 10 = 20, а это меньше 127
транслятор мне говорит что тип int не может быть присвоен типу byte
при этом я же как-то присвоил 10 переменной i, хотя 10 это тип int, ну значит он преобразовался в тип byte
ну так почему результат (10 + 10) не преобразовался в byte, чтоб не допустить возможные ошибки, потому что я могу написать (10 + 200)?
 int x = 10; 
x = x + x;
ну а тута все работает же, хотя я мог выйти за диапазон int
Голосование за лучший ответ
Sergio 2.1 Оракул (67306) 1 год назад
Ваши трудности связаны с автоматическими преобразованиями типов в Java. Когда вы выполняете операцию сложения, операнды автоматически преобразуются в int перед выполнением операции.

Так что когда вы пишете i = i + i, вы на самом деле сначала приводите i к int, складываете два int, получаете int в ответ и пытаетесь присвоить это обратно byte переменной i.

Если результат сложения больше, чем byte может содержать, вы получите ошибку времени компиляции. Для того чтобы избежать этого, вам нужно явно привести результат обратно к byte:
 byte i = 10;  
i = (byte) (i + i);
В случае int x = 10; x = x + x; все работает корректно, поскольку int имеет больший диапазон значений, и результат сложения поместится в этот диапазон. Нет необходимости в явном приведении типов.
ХакуУченик (32) 1 год назад
а зaeбись классно
вот ваша строгая типизация
камшот, это унаследовано от Сишки, о чём бот, конечно, не знает. Он вообще ничего не знает. В Сишке int был размером регистра общего назначения на данной конкретной архитектуре. Идея была в том, что арифметические операнды в любом случае расширяются до регистра, и результат получается тоже в регистре. А как его преобразовать обратно в короткий тип, программист сам должен определить.
Похожие вопросы