48.67K
Category: mathematicsmathematics

Особливості роботи з типами

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
English     Русский Rules