1024 * 1024 * 1024 * 1024
i 2147483648
nie mają tej samej wartości w Javie.
W rzeczywistości 2147483648
NIE JEST NAWET WARTOŚCIĄ (chociaż 2147483648L
jest) w Javie. Kompilator dosłownie nie wie, co to jest ani jak go używać. Więc jęczy.
1024
jest prawidłową liczbą int w Javie, a poprawna int
pomnożona przez inną poprawną int
jest 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 ( BigInteger
w Javie), zgłaszają wyjątek lub ustawiają wartość na magiczną wartość, taką jak not-a-number.