Преобразование в JAVA довольно просто, но требует некоторого понимания.Как объясняется в JLS для целочисленных операций :
Если у целочисленного оператора, отличного от оператора сдвига, есть хотя бы один операнд типа long, то операция выполняется с использованием 64-битная точность, и результат числового оператора имеет тип long.Если другой операнд не длинный, он сначала расширяется (§5.1.5), чтобы печатать long с помощью числового преобразования (§5.6).
И пример всегда является лучшим способом перевода JLS;)
int + long -> long
int(1) + long(2) + int(3) -> long(1+2) + long(3)
В противном случае операция выполняется с 32-битной точностью, ирезультат числового оператора имеет тип int.Если любой из операндов не является целым, он сначала расширяется до типа int с помощью числового продвижения.
short + int -> int + int -> int
Небольшой пример использования Eclipse, чтобы показать, что даже добавление двух short
не будет таким простым:
short s = 1;
s = s + s; <- Compiling error
//possible loss of precision
// required: short
// found: int
Это потребует приведения свозможная потеря точности.
То же самое верно для операторов с плавающей запятой
Если хотя бы один из операндов числового оператора имеет типdouble, тогда операция выполняется с использованием 64-битной арифметики с плавающей точкой, а результатом числового оператора является значение типа double.Если другой операнд не является двойным, он сначала расширяется (§5.1.5), чтобы набрать double путем числового преобразования (§5.6).
Таким образом, продвижение выполняется с плавающей точкой в двойное число.
И смешивание целых и плавающих значений приводит к плавающим значениям, как сказано
Если хотя бы один из операндов бинарного оператора имеет тип с плавающей запятой, то операция является операцией с плавающей запятой, даже если другой является целочисленным.
Это верно для бинарных операторов, но не для «операторов присваивания», таких как +=
Достаточно простого рабочего примера, чтобы доказать это
int i = 1;
i += 1.5f;
Причина в том, что здесь выполняется неявное приведение, которое будет выполняться как
i = (int) i + 1.5f
i = (int) 2.5f
i = 2