Назад Зміст Вперед

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

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

Розширення типів

Вираз
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; //Хибний результат, 0, бо літерали 1 та 2 - це цілі літерали, і операція виконується як з цілими

Кількість мілісекунд у місяці

print(1000*60*60*24*30);  //результат -1702967296

Помилка компіляції

byte b =5;
byte c =-b;

Правила розширення цілочисельних типів

  • Якщо хоча би один аргумент операції має тип long, то всі аргументи приводяться до цього типу і результат операції також буде типу long. Точність обчислення буде 64 біти, старші біти, які появляться в результаті, відкидаються.
  • Якщо типу long немає, то обчислення проводиться з точністю 32 біти, і всі аргументи переводяться в int (або byte, short, char). Результат також буде int. І відповідно всі біти старші 32 ігноруються.
  • Не існує способу дізнатися, чи відбулося переповнення.

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

Такі обчислення взагалі не породжують помилок.
Спеціальні значення дробового типу: додатна і від'ємна нескінченності (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.

Правила розширення дробових типів

  1. Якщо хоча б один аргумент має тип double, то значення всіх аргументів приводяться до цього типу і результат операції також буде типу double. Точність обчислення буде 64 біти.
  2. Якщо аргументів типу double немає, а є хоча би один аргумент типу float, то всі аргументи приводяться до float. Результат операції буде типу float. Точність - 32 біти.
  3. Якщо хоча б один із аргументів буде NaN, то і результат буде NaN.

Приведення примітивних типів даних

Приведення типів (casting) дозволяє конвертувати значення примітивів з одного типу в інший:
  • явне (explicit) приведення
  • неявне (implicit) приведення
Неявне приведення типів - зазвичай відбувається при розширенні діапазону значень, конвертування відбувається автоматично (наприклад, присвоювання значення змінної з меншим діапазоном значень: byte в int).

Явне приведення типів. Якщо значення одного типу не може бути побічно присвоєно змінній іншого типу, то використовується оператор явного перетворення типів (type casting).
(бажаний тип) наявний тип
Наприклад, 
int x = (int)3957.229; //Legal cast
System.out.println("int x = "+x);
Результат: int x = 3957










.