Problem z wieloma dwoma liczbami Java z liczbami ujemnymi [duplikat]

Dec 16 2020

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

1 LiveandLetLive Dec 16 2020 at 03:10

Maksymalna dodatnia wartość, którą intmożna utrzymać, jest 2147483647powyż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 -2147483648pomnożeniu przez -1, staje się, 2147483648ale intzmienna nie może mieć tak dużej wartości dodatniej; więc zacznie się od końca ujemnego (tj Integer.MIN_VALUE.).

1 tibetiroka Dec 16 2020 at 03:09

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).