Java. Перетворення та приведення типів. Автоматичне просування типів у виразах




Перетворення та приведення типів. Автоматичне просування типів у виразах



Пошук на інших ресурсах:

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

 


Зв’язані теми