При работе с примитивными данными, часто возникает необходимость преобразовывать один тип данных к другому. Например, мы хотим преобразовать целое число к дробному или наоборот.
Все преобразования можно разделить на два типа: явные и неявные. Рассмотрим каждый тип отдельно.
Неявные преобразования
Неявные преобразования характерны для присваивания с расширением типа. Например, мы присваиваем byte к int, или float к double.
Ниже будет представлена схема, по которой работают автоматические преобразования типов.
Черными сплошными стрелками показаны неявные преобразования без потери точности.
Черными прерывистыми стрелками показаны неявные преобразования с возможной потерей точности.
Явные преобразования
Когда невозможно произвести неявное преобразование, программисту нужно сказать компилятору о том, что вам такое преобразование необходимо.
Тип, к которому необходимо преобразование, указывается в круглых скобках (см. выше). При таких преобразованиях возможны потери информации и полное искажение данных. Ответственность за сохранение точности данных лежит на программисте.
Также, при преобразовании дробных типов к целочисленным, дробная часть отбрасывается. Таким образом, остается только целая часть.
Преобразования при математических операциях
Что, если необходимо сложить (или выполнить другую операцию) с двумя или более числами разных типов? В этом случае нужно придерживаться четырех правил:
- Если в одном из операндов присутствует тип double, то остальной операнд, также преобразуется в double.
- Если в одном из операндов присутствует тип float, то остальной операнд, также преобразуется в float.
- Если в одном из операндом присутствует тип long, то остальной операнд, также преобразуется в long.
- Иначе все операнды преобразуются к типу int.
Данные правила необходимо проверять последовательно, начиная с первого. Остановиться следует на том правиле, которое выполняется. Рассмотрим пример:
Чтобы понять, что происходит, обратимся к правилам преобразования. Среди операндов нет типа double, переходим к правилу 2. Типа float тоже нет, как и long, соответственно, все операнды преобразуются к типу int (правило 4). После того, как выполнилась операция сложения, результат будет типа int, который мы пытаемся записать в тип short. Данное преобразование не может быть выполнено неявно, поэтому необходимо его выполнить явно, указав желаемый тип в скобках.