JavaRush /Курсы /Java Syntax /Преобразование типов

Преобразование типов

Java Syntax
10 уровень , 3 лекция
Открыта

— А теперь самое интересное. Я расскажу тебе про преобразование типов. Хоть типы переменных всегда неизменны, есть место, где можно проводить преобразование типов. И место это – присваивание.

— Можно присваивать друг другу переменные разных типов. При этом значение, взятое из переменной одного типа, будет преобразовано в значение другого типа и присвоено второй переменной.

— В связи с этим, можно выделить два вида преобразования типов: расширение и сужение. Расширение похоже на перекладывание из маленькой корзинки в большую – операция проходит незаметно и безболезненно. Сужение типа – это перекладывание из большой корзинки в маленькую: места может не хватить, и что-то придётся выбросить.

— Вот типы, отсортированные по размеру «корзинки»:

Преобразование типов

— Тут есть пара замечаний:

1. char такая же корзинка, как и short, но свободно перекладывать из одной в другую нельзя: при перекладывании значения из short в char, всегда будут теряться значения меньше 0. При перекладывании из char в short будут теряться значения больше 32-х тысяч.

2. При преобразовании из целых чисел в дробные могут отбрасываться самые младшие части числа. Но т.к. смысл дробного числа в том, чтобы хранить приблизительное значение, то такое присваивание разрешается.

При сужении типа мы должны явно показать компилятору, что мы не ошиблись и отбрасывание части числа сделано намеренно. Для этого используется оператор приведения типа. Это имя типа в круглых скобочках.

— Вот как нужно присваивать переменные разных типов:

Код на Java Описание
byte a = 115;
int b = a;
Расширение типа. Все отлично.
int c = 10000;
byte d = (byte) c;
Сужение типа. Нужно явно отбросить лишние байты.
int c = 10;
byte d = (byte) c;
Сужение типа. Нужно явно отбросить лишние байты, даже если они равны 0.
float f = 10000;
long l = (long) (f * f);
float f2 = l;
long l2 = (long) f2;
При присваивании к float, происходит расширение типа. При присваивании значения float к long, происходит сужение – необходимо приведение типа.
double d = 1;
float f = (float) d;
long l = (long) f;
int i = (int) l;
short s = (short) i;
byte b = (byte) s;
Сужение во всех операциях присваивания, кроме первой строки, требует указания явного преобразования типа.
10
Задача
Java Syntax Pro, 10 уровень, 3 лекция
Недоступна
Экранирование символов
Выведи на экран следующий текст в две строки: It's Windows path: "C:\Program Files\Java\jdk-13.0.0\bin" It's Java string: \"C:\\Program Files\\Java\\jdk-13.0.0\\bin\" Подсказка: \” – экранирование двойной кавычки; \\ – экранирование обратной косой черты (\). Больше про экранирование символов и Esca

Оператор приведения типа нужно указывать перед числом/переменной каждый раз, когда происходит отбрасывание части числа или сужение типа. Он действует только на число/переменную, которое идет непосредственно за ним.

Код на Java Описание
float f = 10000;
long l = (long) f * f;
К типу long приводится только одна переменная из двух: умножение long и float дает float. Данный пример кода не будет скомпилирован.
float f = 10000;
long l = (long) (f * f);
Тут все выражение приводится к типу long. Этот пример кода будет скомпилирован.

— Ясно.

10
Задача
Java Syntax Pro, 10 уровень, 3 лекция
Недоступна
Кодировка Unicode
В публичный статический метод init(char[]) передается массив символов размером 9, который нужно заполнить следующими символами: 0 - '\u00A9' 1 - '\u004A' 2 - '\u0061' 3 - '\u0076' 4 - '\u0061' 5 - '\u0052' 6 - '\u0075' 7 - '\u0073' 8 - '\u0068' Чтобы посмотреть результат, запусти метод main().
10
Задача
Java Syntax Pro, 10 уровень, 3 лекция
Недоступна
Поздравление
Проинициализируй статические переменные следующими значениями: - partyFace - "\uD83E\uDD73" - balloon - "\uD83C\uDF88" - gift - "\uD83C\uDF81" - partyPopper - "\uD83C\uDF89" - cake - "\uD83C\uDF82" Чтобы посмотреть поздравление, запусти метод main().
Комментарии (158)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
hidden #2544557 Уровень 10 Expert
29 марта 2022
Я думал до этого что-то не совсем понимаю, теперь я вообще ничего не понимаю 🤯
Иван Уровень 25
3 сентября 2022
Я тоже!
Anonymous #2759400 Уровень 20
13 ноября 2021
вроде бы лекция понятная, но я не могу представить для чего нужно сужать значения при этом потеряв значительное количество информации, и получив в итоге совсем другое значение, есть знающие люди??1
Anonymous #2759400 Уровень 20
24 ноября 2021
ладно, немного подумав над этим, пришел к выводу, что сужение типа можно использовать для экономии памяти, в случае если значение безболезненно можно положить в коробку поменьше,. Однако вопрос остается открытым. Может все таки есть случаи когда можно откинуть пару байтов информации и это не повлияет на результат программы?
Anonymous #2759400 Уровень 20
12 декабря 2021
lastix Уровень 35
13 декабря 2021
а ты настойчивый)
Виктор Уровень 1
30 марта 2022
Я полагаю, что вы, как программист, должны предусмотреть вариант, когда у вас есть значащие разряды, которые могут быть потеряны и решить насколько это оправданно и что с этим делать. Например, у вас в вычислениях используется высокая точность (тип double). Потом вы должны формировать массив, где точность будет до процента. Вы выполняете сужение типа, уменьшая объем в 8 раз.
Евгений N Уровень 23
4 мая 2022
а затем вместо таблицы передаем в xml, увеличивая объем в 10 раз.😀 есть и другой подход: в таблицах Oracle можно задать и длину и точность хранимых данных, но ... они служат лишь для check вводимых значений, при любом же раскладе, даже если оставить стандартный тип number, размер байт под хранение определяет сама субд динамически: от 0 до 22 байт!
Art Rich Уровень 8
1 октября 2021
😉
Aleksandr Gorohov Уровень 28
27 сентября 2021
Ясно.
Сергей Уровень 31
8 апреля 2021
Присоединяюсь к вопросу от HelloWorld. Какая-то неувязка получается.
VS Уровень 26
24 марта 2021
Здравствуйте! Поясните, пожалуйста: В лекции указано следующее: float f = 10000; long l = (long) (f * f); float f2 = l; long l2 = (long) f2; Комментарий справа: "При присваивании к float, происходит расширение типа. При присваивании значения float к long, происходит сужение – необходимо приведение типа." В то же время, выше в лекции указано, что float занимает в памяти 4 бита, а long - 8 бит. Соответственно, при переходе от float к long происходит разве сужение? От 4 к 8 - представляется как расширение. Если я что-то упустил, то прошу вас пояснить.
Yeikovych Volodymyr Уровень 47
23 апреля 2021
Поясняю, ты присваиваешь float (дробное значение) к long (целому значению) и например float будет 56.78. Хотя long больше float но float может содержать дробь, компилятор не может проверить у тебя float = 56 или 56.78. Поэтому нужно указывать компилятору (long) тогда он будет округлять до типа long в любом случае. P.S Вы уже на 18 лвле, так что мой ответ возможно не актуален, но если у кого-то возникнет подобный вопрос, ему это вероятно поможет. ))
VS Уровень 26
26 апреля 2021
Спасибо
antlantis Уровень 41
26 января 2021
Ребята, подскажите пожалуйста, как это понимать: "При преобразовании из целых чисел в дробные могут отбрасываться самые младшие части числа. " Какие младшие части числа у целого числа?
Flexo Уровень 41
4 февраля 2021
числа наименьших разрядов у числа 1234567 это, например, 7
Zav_O Уровень 19
17 марта 2021
10001==10*10^3
Александр Уровень 22
21 декабря 2020
Возможно будет полезно! Правила продвижения типов из книги Шилдта. Сначала все значения типа byte, short и char продвигаются к типу int. Затем тип всего выражения продвигается к типу long, если один из его операндов относится к типу long. Если же один из операндов относится к типу float, то тип всего выражения продвигается к типу float. А если любой из операндов относится к типу double, то и результат вычисления всего выражения относится к типу double.
Тони Уровень 10
10 декабря 2020
Я правильно понимаю, что float более "вместительнее" чем long ? вроде: float = 4, а long = 8.
Justinian Уровень 41 Master
3 января 2021
конечно. Вот пример Long: 1 (1L) вот пример float: 1.12355 (1.12355f) как видим, float вмещает больше информации чем Long и имеет большую точность, поэтому float шире. Но и по самим значениям float на многие порядки вместительнее long: максимальное значение для Long -> 2^63-1 максимальное значение для float -> (3.4)*10^38 а что что размер float меньше, это не важно, поскольку float по другому хранит данные. Ну например что больше, число, запись которого помещается в 8 символов или число, запись которого помещается в 5 символов? Первое число: 10 000 000 -> 10 млн, 8 символов. Второе число: 10^18 -> 10 в 18 степени или один квинтиллион, записывается 5 символами
Тони Уровень 10
21 января 2021
Спасибо
Антон Уровень 22
4 декабря 2020
Zav_O Уровень 19
17 марта 2021
Всегда захожу в комментарии ради таких ссылок, спасибо тебе, добрый человек