Problem z wieloma dwoma liczbami Java z liczbami ujemnymi [duplikat]
Niedawno mam do czynienia z poniższym problemem
public class Main {
public static void main(String[] args) throws Exception {
// Your code here!
int i = -2147483648;
int j = i * -1;
System.out.println("j="+j);
}
}
Wynik: -2147483648
IDE online z kodem: https://paiza.io/projects/e/17lF_6-GltIcyubZv3QoFg?theme=twilight
Ale jak to działa zgodnie z logiką, której potrzebuję, aby uzyskać 2147483648, to prawda? Więc skąd mam tę liczbę ujemną? To z powodu zakresu liczb całkowitych (Integer.MIN_VALUE)? jak rozwiązać ten problem?
Odpowiedzi
Maksymalna dodatnia wartość, którą int
można utrzymać, jest 2147483647
powyżej której wartość przechodzi na drugi koniec (tj. Zaczyna się od ujemnego końca). Możesz to zrozumieć z następującego demo:
public class Main {
public static void main(String[] args) {
int i = -2147483648;
int j = i * -1;
System.out.println("j=" + j);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MAX_VALUE + 1);
System.out.println(Integer.MIN_VALUE);
// Some more examples for you to understand this concept better
System.out.println(Integer.MAX_VALUE + 2);
System.out.println(Integer.MAX_VALUE + 3);
}
}
Wynik:
j=-2147483648
2147483647
-2147483648
-2147483648
-2147483647
-2147483646
Po -2147483648
pomnożeniu przez -1
, staje się, 2147483648
ale int
zmienna nie może mieć tak dużej wartości dodatniej; więc zacznie się od końca ujemnego (tj Integer.MIN_VALUE
.).
Numer 2147483648 nie istnieje. Największa wartość liczby int to 2147483647, czyli o 1 mniej niż oczekiwany wynik. Mnożenie powoduje przepełnienie, które „cofa” liczbę do najmniejszej ujemnej wartości i kontynuuje obliczenia od tego momentu. (Innymi słowy: 2147483647 + 1 = -2147483648 (najmniejsza ujemna wartość)) Ponieważ wynik przekroczy tylko 1 wartość maksymalną, nie jest wymagana żadna dodatkowa akcja i zwracana jest minimalna wartość int.
Jeśli chcesz rozwiązać ten problem, użyj dla zmiennych „long” zamiast „int”. Możesz również użyć bardziej złożonych klas, takich jak BigDecimal, lub napisać niestandardową funkcję mnożenia dla tablic bajtowych.
Uwaga: niezależnie od używanego typu liczbowego, o ile pamięć używana do reprezentowania liczby jest ograniczona, możesz napotkać podobne problemy. Chociaż w normalnych okolicznościach jest to mało prawdopodobne, nawet dla 32-bitowej liczby całkowitej (int).