В Java, если мы разделим byte
s, short
s или int
s, мы всегда получим int
. Если один из операндов long
, мы получим long
.
Мой вопрос: почему деление byte
или short
не приводит к byte
или short
? Почему всегда int
?
По-видимому, я не ищу ответа «потому что JLS так говорит», я спрашиваю о техническом обосновании этого дизайнерского решения на языке Java.
Рассмотрим этот пример кода:
byte byteA = 127;
byte byteB = -128;
short shortA = 32767;
short shortB = -32768;
int intA = 2147483647;
int intB = - -2147483648;
long longA = 9223372036854775807L;
long longB = -9223372036854775808L;
int byteAByteB = byteA/byteB;
int byteAShortB = byteA/shortB;
int byteAIntB = byteA/intB;
long byteALongB = byteA/longB;
int shortAByteB = shortA/byteB;
int shortAShortB = shortA/shortB;
int shortAIntB = shortA/intB;
long shortALongB = shortA/longB;
int intAByteB = intA/byteB;
int intAShortB = intA/shortB;
int intAIntB = intA/intB;
long intALongB = intA/longB;
long longAByteB = longA/byteB;
long longAShortB = longA/shortB;
long longAIntB = longA/intB;
long longALongB = longA/longB;
byteA
, разделенное на byteB
, не может быть ничем иным, как байтом, не так ли?
Так почему же byteAByteB
должно быть int
? Почему shortALongB
не может быть short
?
Почему intALongB
должно быть long
, результат всегда будет соответствовать int
, не так ли?
Обновить
Как указал @Eran, (byte)-128/(byte)-1
приводит к 128
, что не соответствует byte
. Но почему тогда не short
?
Обновление 2
Далее, как указал @Eran (снова), (int) -2147483648 / (int) -1
также не соответствует int
, но результат тем не менее int
, а не long
.