Почему byte + = 1 компилировать, но byte = byte + 1 нет?

Если у меня есть байтовая переменная: byte b = 0;

Почему работает следующая работа:

   b++;
   b += 1; // compiles

... но это не так?

   b = b + 1; // compile error

Сначала компилятор понимает как byte и второй как int?

[EDIT]

Я знаю кастинг, но хочу обратить ваше внимание на b++, b += 1 and b = b + 1

Я думаю, что они равны, поэтому компилятор их отличает? в чем разница между

  b += 1 and b = b + 1 ?

Ответы

Ответ 1

Потому что b += 1 эквивалентен b = (byte)(b + 1), тогда как тип b + 1 продвигается до int (JLS §5.6.2. Двоичное числовое продвижение.), и поэтому его результат не может быть назначен byte без явного преобразования.

Из JLS, §15.26.2 Операторы присваивания соединений:

Выражение составного присваивания формы E1 op = E2 эквивалентно E1 = (T) ((E1) op (E2)), где T - тип E1, за исключением того, что E1 оценивается только один раз.

Ответ 2

Возможная потеря точности - проблема. Бросьте его, и все в порядке.

b = (byte) (b + 1);

Ответ 3

Да, результатом + -операции является int, поэтому для приведения его в соответствие переменной byte необходим приведение.

Ответ 4

В java значение по умолчанию для целых чисел - int, а для чисел с плавающей запятой - double. Поэтому b по умолчанию преобразуется в целое число для выполнения операции. Поэтому результирующий ответ должен быть придумано перед сохранением, чтобы предотвратить любую возможную потерю точности. Но b+=1 делает это автоматически.

Ответ 5

операнды типа byte и short автоматически передаются в int перед передачей операторам

поэтому, когда вы делаете байт b = b + 1; он считает это "int", поскольку операция выполняется по значению байта. поэтому, чтобы этого избежать, мы используем b + = 1; здесь он автоматически присваивается байту.

Ответ 6

Вам нужно передать в байт:

b = (byte) (b + 1);

Ответ 7

Выполнение b + 1 расширяет результат до целого числа, а присвоение обратно байту b приведет к потере точности. Объяснено: Конверсии и рекламные акции. Но мне нравится, как лучше ответить axtavt.

Ответ 8

Я не покупаю аргумент о потере точности, поскольку компилятор не будет защищать вас аналогичным образом при работе с ints и longs. Я думаю, что реальный ответ заключается в том, что JLS просто лучше поддерживает ints, чем байты, как указано в этом ответе: fooobar.com/info/342113/...