Problème Java Multiple Two Numbers avec des nombres négatifs [duplicate]

Dec 16 2020

Je suis récemment confronté au problème ci-dessous

 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);
    }
}

Résultat: -2147483648

IDE en ligne avec code: https://paiza.io/projects/e/17lF_6-GltIcyubZv3QoFg?theme=twilight

Mais comment cela fonctionne selon la logique dont j'ai besoin pour obtenir 2147483648 est un résultat non? Alors comment j'ai eu ce nombre négatif? C'est à cause de la plage entière (Integer.MIN_VALUE)? comment résoudre ce problème?

Réponses

1 LiveandLetLive Dec 16 2020 at 03:10

La valeur positive maximale qu'une intpeut contenir est 2147483647au - delà de laquelle la valeur va à l'autre extrémité (c'est-à-dire qu'elle commence à partir de l'extrémité négative). Vous pouvez le comprendre à partir de la démo suivante:

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);
    }
}

Production:

j=-2147483648
2147483647
-2147483648
-2147483648
-2147483647
-2147483646

Après avoir -2147483648été multipliée par -1, elle devient 2147483648mais une intvariable ne peut pas contenir autant de grande valeur positive; donc, il commencera par la fin négative (c'est-à-dire Integer.MIN_VALUE).

1 tibetiroka Dec 16 2020 at 03:09

Le numéro 2147483648 n'existe pas. La plus grande valeur d'un int est 2147483647, soit 1 plus petit que votre résultat attendu. La multiplication provoque un débordement, qui «ramène» le nombre à la plus petite valeur négative et continue le calcul à partir de là. (En d'autres termes: 2147483647 + 1 = -2147483648 (plus petit négatif)) Étant donné que le résultat ne serait que 1 au-dessus de la valeur maximale, aucune action supplémentaire n'est requise et la valeur minimale int est renvoyée.

Si vous souhaitez résoudre ce problème, utilisez «long» au lieu de «int» pour vos variables. Vous pouvez également utiliser des classes plus complexes comme BigDecimal ou écrire une fonction de multiplication personnalisée pour les tableaux d'octets.

Remarque: quel que soit le type numérique que vous utilisez, tant que la mémoire utilisée pour représenter le nombre est finie, vous pouvez rencontrer des problèmes similaires. Bien que dans des circonstances normales, cela soit peu probable, même pour un entier de 32 bits (int).