Добавление байтов преобразуется в int из-за правил языка java или из-за jvm?

byte a = 1;
byte b = 1;
byte c = a + b;

ошибка бросков: возможная потеря точности

byte subt = a_s - a_b;
                ^
  required: byte
  found:    int

это поведение имеет какое-то отношение к jvm или было определено на языке java .

EDIT: и если он определен на языке java, то делает это из-за сохранения jvm в виду ?

означает, если java поддерживает byte тип данных тогда почему operation on byte результаты int

6 ответов


если java поддерживает байтовый тип данных, то почему операция с байтовыми результатами int

потому что так разработана виртуальная машина Java. Нет набора инструкций для выполнения операции с типом byte. Скорее набор инструкций для int тип используется для работы на boolean, byte, char и short типы.

С спецификация JVM-раздел 2.11.1:

компилятор кодирует нагрузки литерал значения типа byte и short использование инструкций виртуальной машины Java, которые подписывают-расширяют эти значения до значений типа int во время компиляции или во время выполнения. Нагрузки литеральных значений типов boolean и char кодируются с помощью инструкций, которые нуль-расширяют литерал до значения типа int во время компиляции или во время выполнения. [..]. Таким образом, большинство операций со значениями фактических типов boolean, byte, char и short правильно выполнены инструкциями работая дальше значения вычислительного типа int.

причина этого также указана в этом разделе:

учитывая виртуальную машину Java размер однобайтового кода операции, кодирование типов в Коды операций оказывает давление на проект его набора команд. Если бы каждая типизированная инструкция поддерживала все типы данных времени выполнения виртуальной машины Java, было бы больше инструкций, чем может быть представлено в byte. [...] Отдельный инструкции могут использоваться для преобразования неподдерживаемых и поддерживаемых типов данных по мере необходимости.

для получения подробной информации о том, что все наборы инструкций доступны для различных типов, вы можете пройти через таблицу в этом разделе.

существует также таблица, указывающая отображение фактического типа в вычислительный тип JVM:


компилятор поступает правильно. Потому что (a + b) может выходить за пределы максимального значения, которое может храниться в байтовой переменной. Если вы сообщите компилятору a, значения b не изменяются, используя ключевое слово "final", оно больше не будет жаловаться.

final byte a = 1;
final byte b = 1;
byte c = a + b;

JLS 5.6.2: бинарное числовое продвижение охватывает его:

расширение примитивного преобразования (§5.1.2) применяется для преобразования одного или обоих операндов, как указано в следующих правилах:

  • если любой из операндов имеет тип double, другой преобразуется в double.

  • в противном случае, если один из операндов имеет тип float, другой преобразуется в float.

  • в противном случае, если один из операндов имеет тип long, другой преобразуется в long.

  • в противном случае оба операнда преобразуются в тип int.


Да, это спецификация языка.

оператор сложения (+). при добавлении, 'a' преобразует (неявно бросает) в int тип, b также ввести int. Отсюда result неявно типа int.

то же самое для - тоже оператор.


при выполнении арифметических операций над любыми операндами результат сохраняется в этой форме MAX(int,тип операнд1,тип операнд2,...тип operandN) Бывший: byte a=10; byte b=20; byte c=a+b;

тогда результат a+b будет сохранен в виде MAX(int, тип operand1, тип operand2,...тип operandN ) в этом деле MAX (int, byte, byte) максимальное значение-int, которое является максимальным, поэтому c будет иметь значение int, но c был объявлен как байт, и мы не можем хранить значение int(больше) в байт(меньше). этот то же самое относится к каждому арифметическому оператору.

вот почему ошибка говорит ошибка: несовместимые типы: возможно преобразование с потерями из int в байт


компилятор прав, объявляет переменные final или cast to byte:

byte b =  1;
byte c =  22;
byte a = (byte) (b + c);

JAVA: byte+byte = int

:)