Главная » Java » Неявное преобразование типов Java

0

Некоторые преобразования выполняются автоматически – они не требуют внимания со стороны программиста и поэтому называются неявными (implicit conversions).

Любая числовая величина может быть присвоена переменной числового типа, поддерживающего более обширный диапазон значений, – в этом случае говорят о преобразовании к более широкому типу. Значение char, например, допускается использовать в любом контексте, где предполагается задание значения int. Число с плавающей запятой может быть присвоено переменной, относящейся к Тому же или более широкому (более точному) типу с плавающей запятой.

Разрешается также выполнение неявных преобразований целых величин в числа с плавающей запятой, но не наоборот. Преобразование целого значения в число с плавающей запятой обычно не грозит потерей значащих разрядов, Поскольку диапазон изменения значений любого типа с плавающей Запятой перекрывает соответствующие диапазоны всех целочисленных типов. Следует, Однако, иметь в виду, что предотвращение потери точности мантиссы (целой) части числа – не то же самое, что сохранение точности дробной Части. В процессе некоторых неявных преобразований определенные разряды мантиссы могут быть утрачены. Рассмотрим пример присваивания значения long переменной типа float. Тип float отводит для хранения данных 32 Бита, тогда как тип long – 64 бита. Переменные float позволяют сохранять Меньше значащих разрядов мантиссы, нежели long хотя поддерживаемый ими диапазон значений гораздо шире. Поэтому при присваивании числа long переменной float вполне возможна потеря данных. Взгляните:

long orig = 0x7effffff00000000L;

float fval = orig;

long losе = (long)fval;

 

System.out.println("orig = " + orig);

Systеm.оut.println ("fvаl = " + fval);

System.out.println("lose = " + losе);

 

В двух первых выражениях объявляется и инициализируется переменная огig типа long, а затем ее значение присваивается переменной fval типа float. Далее, чтобы продемонстрировать факт потери точности, мы выполняем явное обратное преобразование значения fval в long и присваиваем результат другой переменной, lose, типа long (вопросы явного преобразования типов рассмотрены в следующем разделе). Изучив приведенные ниже результаты работы Программы, вы убедитесь, что в процессе преобразования long в float Произошла потеря точности – значения переменных оrig и lose различаются:

 

orig = 9151314438521880576

fval = 9.1513144Е18

orig = 9151314442816847872

 

В соответствии с принятым соглашением, целочисленные именованные константы (не long) могут быть объявлены с указанием более "мелкого" целого типа без явного преобразования, если значение константы действительно "попадает" в соответствующий допустимый диапазон. Например, два первых выражения допустимы, а третье – нет:

 

short s1 = 27; // Неявное преобразование int в short

byte b1 = 27; // Неявное преобразование int в byte

short s2 = Ox1FFFF; // НЕВЕРНО: значение int слишком велико

   // для short

В подобных случаях говорят о преобразовании значений к более узкому типу.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии