1024 * 1024 * 1024 * 1024
і 2147483648
не мають однакового значення на Java.
Насправді, В 2147483648
ЯВІ НЕ БУДЕ ЦІННА (хоча 2147483648L
є). Компілятор буквально не знає, що це таке, або як ним користуватися. Так воно скуголить.
1024
є дійсним int на Java, а дійсний, int
помножений на інший дійсний int
, завжди є дійсним int
. Навіть якщо це не те саме значення, яке ви б інтуїтивно очікували, оскільки обчислення переповниться.
Приклад
Розглянемо наступний зразок коду:
public static void main(String[] args) {
int a = 1024;
int b = a * a * a * a;
}
Чи очікуєте ви, що це призведе до помилки компіляції? Це стає трохи більш слизьким.
Що робити, якщо ми помістимо цикл з 3 ітераціями і помножимо на циклі?
Компілятору дозволено оптимізувати, але він не може змінити поведінку програми під час цього.
Деякі відомості про те, як насправді ведеться ця справа:
У Java та багатьох інших мовах цілі числа будуть складатися з фіксованої кількості бітів. Розрахунки, які не вписуються в задану кількість біт, переповняться ; обчислення в основному виконується модулем 2 ^ 32 в Java, після чого значення перетворюється назад у підписане ціле число.
Інші мови чи API використовують динамічне число біт ( BigInteger
на Java), підвищують виняток або встановлюють значення на магічне значення, наприклад, не-а-число.