1024 * 1024 * 1024 * 1024i 2147483648nie mają tej samej wartości w Javie.
W rzeczywistości 2147483648 NIE JEST NAWET WARTOŚCIĄ (chociaż 2147483648Ljest) w Javie. Kompilator dosłownie nie wie, co to jest ani jak go używać. Więc jęczy.
1024jest prawidłową liczbą int w Javie, a poprawna intpomnożona przez inną poprawną intjest zawsze poprawna int. Nawet jeśli nie jest to ta sama wartość, której można by się intuicyjnie spodziewać, ponieważ obliczenia będą przepełnione.
Przykład
Rozważmy następujący przykład kodu:
public static void main(String[] args) {
int a = 1024;
int b = a * a * a * a;
}
Czy spodziewałbyś się, że spowoduje to błąd kompilacji? Teraz robi się trochę bardziej ślisko.
A co jeśli umieścimy pętlę z 3 iteracjami i pomnożymy w pętli?
Kompilator może optymalizować, ale nie może zmieniać zachowania programu w tym czasie.
Kilka informacji o tym, jak faktycznie załatwiamy tę sprawę:
W Javie i wielu innych językach liczby całkowite będą składały się ze stałej liczby bitów. Obliczenia, które nie mieszczą się w podanej liczbie bitów, zostaną przepełnione ; Obliczenie jest wykonywane w zasadzie Modulus 2 ^ 32, Jawa, po czym wartość jest przekształcany z powrotem do podpisanego całkowitej.
Inne języki lub interfejsy API używają dynamicznej liczby bitów ( BigIntegerw Javie), zgłaszają wyjątek lub ustawiają wartość na magiczną wartość, taką jak not-a-number.