Итак, тип short - 16 бит, от -32768 до 32767. Простой код: short x1 = 5, x2 = 38 x1 = x1 + x2 System.out.println(x1) Ругается на ошибку во 2 строке, просит привести к типу int: Uncompilable source code - incompatible types: possible lossy conversion from int to short Хотя казалось бы, почему - сложение двух чисел одного типа. Но такой код, как ни странно, работает без ошибок: short x1 = 5, x2 = 38 x1 += x2 System.out.println(x1) Вывод: 43 Почему?
Ответ Любые арифметические операции над типом short на выходе дают int (результат автоматически кастуется в int). В случае же с x1 += x2 по факту происходит x1 = (short) (x1 + x2) При вычислении выражения (a @ b) аргументы a и b преобразуются в числа, имеющие одинаковый тип: если одно из чисел double, то в double иначе, если одно из чисел float, то в float иначе, если одно из чисел long, то в long иначе, оба числа преобразуются в int То есть, все целочисленные литералы в выражениях, а так же типы byte, short и char расширяются до int.