Перетворення та приведення типів. Автоматичне просування типів у виразах
- 1. Що таке явне та автоматичне приведення типів у виразах?
- 2. Як виглядає явне приведення типів у виразах? Приклади
- 3. Приклади автоматичного приведення типів
- 4. Як здійснюється автоматичне просування типів у виразах?
- 5. Приклад просування з типу byte в int в якому вираз не містить операндів-змінних типу int (long)
- 6. Приклад просування з типу byte в тип int, в якому вираз містить змінну типу int
- 7. Приклад просування з типу int в тип long
- 8. Приклад просування в тип float
- 9. Приклад просування до типу double
- Зв’язані теми
Пошук на інших ресурсах:
1. Що таке явне та автоматичне приведення типів у виразах?
Приведення типів у виразах може відбуватись у тих випадках, коли змінній одного типу потрібно присвоїти значення змінної іншого типу.
Детально про типи Java описується тут. Використання змінних у програмах можна переглянути тут.
Приведення типів може бути явне та автоматичне.
При явному приведенні типів сама операція приведення задається явним чином.
При автоматичному приведенні типів потрібно, щоб виконувались дві умови:
- обидва типи мають бути сумісними;
- довжина вихідного типу (типу джерела) повинна бути менше довжини цільового типу (типу приймача).
⇑
2. Як виглядає явне приведення типів у виразах? Приклади
Явне приведення типів дозволяє здійснювати присвоєння несумісних типів. Загальна форма явного приведення типів має вигляд:
(цільовий_тип) значення
де
цільовий_тип – це тип, в який потрібно привести вказане значення.
Приклади явного приведення типів.
// явне приведення типів у виразах byte b; int a; double d; float f; d = -39.9203; a = (int)d; // a = -39 f = (float)d; // f = -39.9203 b = (byte)d; // b = -39 d = 302930932; b = (byte)d; // b = -12 - переповнення багатократне a = -27; b = (byte)a; // b = -27
⇑
3. Приклади автоматичного приведення типів
Приклад 1. Автоматичне приведення цілочисельних типів.
// автоматичне приведення цілочисельних типів типів int a; byte b; short sh; b = -23; a = b; // a = -23 - автоматичне приведення типів sh = -150; a = sh; // a = -150 long l = 200; // Помилка: "Type mismatch: cannot convert from long to int" // a = l; l = b; // l = -23 l = sh; // l = -150 char c = 'Z'; a = c; // a = 90 - код символу 'Z' boolean b1 = false; //a = b1; - помилка, типи несумісні
Приклад 2. Автоматичне приведення типів з плаваючою комою.
// автоматичне приведення типів з плаваючою комою float f; double d; f = 3.409033f; d = f; // d = 3.409033
Приклад 3. Автоматичне приведення змішаних типів. Такий випадок можливий, коли змінній типу з плаваючою комою присвоюється значення змінної цілочисельного типу.
// автоматичне приведення змішаних типів float f; double d; int a; a = 28; d = a; // d = 28.0 f = a; // f = 28.0 // Помилка: Type mismatch: cannot convert from float to int // a = f;
⇑
4. Як здійснюється автоматичне просування типів у виразах?
Автоматичне просування типів відбувається у виразах. При цьому, значення, що фігурують у виразах, автоматично просуваються до типів з більшими діапазонами значень.
При автоматичному просуванні типів у виразах:
- якщо один з операндів є типу int, то усі значення типів byte, short та char просуваються в тип int;
- якщо один з операндів є типу long, то весь вираз просувається до типу long;
- якщо один з операндів відноситься до типу float, то тип усього виразу буде також типу float;
- якщо один з операндів відноситься до типу double, то тип усього виразу буде також double.
⇑
5. Приклад просування з типу byte в int в якому вираз не містить операндів-змінних типу int (long).
// просування типів у виразах // byte -> int byte b; b = 1000 / 20; // b = 50, працює, тому що результат поміщається в тип byte
Вищенаведений приклад працює коректно, тому що:
- результат поміщається в тип byte;
- немає операнду типу int.
У вищенаведеному прикладі значення 1000 перевищує діапазон значень типу byte. Спочатку число 1000 приводиться до типу int. Але результат
1000 / 20 = 50
приводиться до типу byte і може коректно поміститись в змінній b.
Якщо написати так:
byte b; b = 100000 / 20; // помилка, тому що результат не поміщається в тип byte
то вийде помилка з виводом повідомлення:
Type mismatch: cannot convert from int to byte
У цьому випадку результат не поміщається в тип byte:
100000 / 20 = 5000
Тоді це число (5000) автоматично стає типом int і компілятор видасть повідомлення про помилку.
Якщо зробити явне приведення типів:
byte b; b = (byte) (100000 / 20); // b = -120
то в цьому випадку результат 5000 типу int перетворюється в тип byte. Як відомо, змінна типу int займає 32 біти, а змінна типу byte займає 8 біт. Значення змінної типу int урізається. І маємо те, що маємо (b = -120).
Вищенаведені приклади відносяться і до змінних типів short та char.
⇑
6. Приклад просування з типу byte в тип int, в якому вираз містить змінну типу int.
// просування типів у виразах // byte -> int byte b; int d; d = 20; b = 1000 / d; // помилка, результат є типом int, тому що змінна d є типу int
У вищенаведеному прикладі у виразі використовується змінна d типу int. Тому компілятор видасть повідомлення про помилку:
Type mismatch: cannot convert from int to byte
Це означає, що результат є типу int (а не byte) навіть якщо значення поміщається в діапазон значень типу byte. Тому що у виразі використовується змінна-операнд d типу int.
Якщо здійснити явне приведення типів, то результат буде коректним:
// просування типів у виразах // byte -> int byte b; int d; d = 20; b = (byte)(1000 / d); // b = 50 - працює коректно
⇑
7. Приклад просування з типу int в тип long
Приклад просування типів з int в long. Якщо один з операндів є типу long, то весь вираз просувається до типу long.
int d; long l; d = 10000 * 200; // працює, d = 2000000 // Помилка! Type mismatch: cannot convert from long to int // d = 1L * 2L; - операнди 1L та 2L є типу long l = 100; d = l * 2; // помилка, один з операндів є типу long
Як видно з прикладу, якщо один з операндів є типу long, то весь вираз стає типу long.
⇑
8. Приклад просування в тип float
У даному прикладі показано, що якщо один з операндів має тип float, то весь вираз просувається до типу float (якщо відсутній тип double).
int d; float f; d = (int)(2.5 * 4); // працює, d = 10, відбувається явне приведення з float в int f = 2.5f; d = (int)(f * 4); // теж працює, d = 10 // помилка: cannot convert from float to int //d = 2.5f * 4; //d = f * 4;
⇑
9. Приклад просування до типу double
У прикладі показано правило:
– якщо один з операндів є типу double, то тип усього виразу просувається до типу double.
int a; float f; double d; a = 20; d = 20.0; // помилка: cannot convert from double to float // f = a + d; f = (float)(a + d); // працює: f = 40.0
⇑
Зв’язані теми
- Типи даних Java
- Змінні. Оголошення змінних. Ініціалізація змінних
- Літерали. Ідентифікатори. Ключові слова. Коментарі