Problème Java Multiple Two Numbers avec des nombres négatifs [duplicate]
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
La valeur positive maximale qu'une int
peut contenir est 2147483647
au - 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 2147483648
mais une int
variable ne peut pas contenir autant de grande valeur positive; donc, il commencera par la fin négative (c'est-à-dire Integer.MIN_VALUE
).
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).