Особливості роботи з цілими типами
Розширення типів
Вираз
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.
Правила розширення дробових типів
- Якщо хоча б один аргумент має тип double, то значення всіх аргументів приводяться до цього типу і результат операції також буде типу double. Точність обчислення буде 64 біти.
- Якщо аргументів типу double немає, а є хоча би один аргумент типу float, то всі аргументи приводяться до float. Результат операції буде типу float. Точність - 32 біти.
- Якщо хоча б один із аргументів буде NaN, то і результат буде NaN.
Приведення примітивних типів даних
Приведення типів (casting) дозволяє конвертувати значення примітивів з одного типу в інший:
- явне (explicit) приведення
- неявне (implicit) приведення
Явне приведення типів. Якщо значення одного типу не може бути побічно присвоєно змінній іншого типу, то використовується оператор явного перетворення типів (type casting).
(бажаний тип) наявний тип
Наприклад,
int x = (int)3957.229; //Legal cast
System.out.println("int x = "+x);
Результат: int x = 3957