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

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



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

 


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