Слайд 1Особливості роботи з типами
Особливості роботи з цілими типами
Розширення цілих типів
Особливості роботи
з дробовими типами
Розширення дрібних типів
Приведення примітивних типів даних
Слайд 2Особливості роботи з цілими типами
Аргумент дорівнює найменшому можливому значенню примітивного типу
int
x=-2147483648;
int y=-x;
Результат y==x и x == -x – true
Переповнення
int x= 300000;
print(x*x);
Результат -194313216
Слайд 3Розширення типів
Вираз
int i = 300000; print (i * i); // Множення
з точністю 32 біта
long m = i; print (m * m); // Множення з точністю 64 біта
print (1 / (m-i)); // Спробуємо отримати різницю значень int та long
Результат
-194313216
90000000000
Помилка ділення на нуль
double x = 1/2; - Помилковий результат
Кількість мілісекунд у місяці
print (1000 * 60 * 60 * 24 * 30) - результат -1702967296
Помилка компіляції
byte b = 5;
byte c = -b;
Слайд 4Правила розширення цілочисельних типів
Якщо хоча б один аргумент операції має тип
long, то всі аргументи приводяться до цього типу і результат операції також буде типу long.
Обчислення буде вироблено з точністю в 64 біта, а більш старші біти, якщо з'являються в результаті, відкидаються.
Якщо ж аргументів типу long немає, то обчислення проводиться з точністю в 32 біти, і всі аргументи перетворяться в int (byte, short, char також). Результат теж int. Всі біти старше 32-го ігноруються.
Немає способу дізнатися, чи відбулося переповнення.
Слайд 5Особливості роботи з дробовими типами
Дробові обчислення взагалі не породжують ніяких помилок!
Спеціальні
значення дробового типу:
позитивна і негативна нескінченності (positive / negative infinity);
1f / 0f - позитивна нескінченність, тип float
-1d / 0d - негативна нескінченність, тип double
значення "не число", Not-a-Number, скорочено NaN;
0.0 / 0.0 - ділення нуль на нуль
(1.0 / 0.0) * 0.0 - множення нескінченності на нуль
позитивний і негативний нулі.
0.0
+0.0
-0.0
0.0 == - 0.0 - true
0.0> -0.0 - false
Слайд 6Правила розширення дробових типів
Якщо хоча б один аргумент має тип double,
то значення всіх аргументів приводяться до цього типу і результат операції також матиме тип double. Обчислення буде здійснене з точністю в 64 біта.
Якщо ж аргументів типу double немає, а хоча б один аргумент має тип float, то всі аргументи приводяться до float, обчислення проводиться з точністю в 32 біта і результат має тип float.
Якщо хоча б один з аргументів має значення NaN, то і результатом операції буде NaN.
Слайд 7Приведення примітивних типів даних
Приведення типів дозволяє конвертувати значення примітивів з одного
типу в інший.
Приведення типів (casting) може бути неявним (implicit) і явним (explicit).
Слайд 8Неявне приведення типів
При неявному приведенні типів немає необхідності писати код для
кастингу: конвертування відбувається автоматично.
Зазвичай неявне приведення типів відбувається при розширенні діапазону значень.
Наприклад, присвоювання значення змінної з меншим діапазоном значень, наприклад byte в контейнер з більш широким діапазоном, наприклад int.
Слайд 9Явне приведення типів
Якщо значення одного типу не може бути побічно присвоєно
змінної іншого типу, використовується оператор явного перетворення типів (type casting):
(бажаний тип) наявний тип
int x = (int) 3957.229; // Legal cast
System.out.println ("int x =" + x);
Результат: int x = 3957