Язык Java всегда поддерживает аргументы арифметических операторов для int, long, float или double. Итак, возьмите выражение:
a + b
где a и b имеют тип байта. Это сокращение для:
(int)a + (int)b
Это выражение имеет тип int. Очевидно, имеет смысл выдавать ошибку при назначении значения int байтовой переменной.
Почему язык должен быть определен таким образом? Предположим, что a равно 60, а b равно 70, тогда a + b равно -126 - целочисленное переполнение. Как часть более сложного выражения, которое должно было привести к int, это может стать трудной ошибкой. Ограничьте использование байтов и кратких для хранения массивов, констант для форматов файлов / сетевых протоколов и головоломок.
Есть интересная запись из JavaPolis 2007. Джеймс Гослинг приводит пример того, как сложна арифметика без знака (и почему она не в Java). Джош Блох указывает, что его пример дает неправильный пример и в обычной знаковой арифметике. Для понятной арифметики нам нужна произвольная точность.