Добавление байтов преобразуется в 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
:)