Problema de Java Multiple Two con números negativos [duplicado]
Recientemente me enfrento al siguiente problema
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);
}
}
Resultado: -2147483648
IDE en línea con código: https://paiza.io/projects/e/17lF_6-GltIcyubZv3QoFg?theme=twilight
Pero cómo funciona según la lógica que necesito para obtener 2147483648 es un resultado, ¿verdad? Entonces, ¿cómo obtuve este número negativo? ¿Es debido al rango de números enteros (Integer.MIN_VALUE)? ¿Cómo arreglar este problema?
Respuestas
El valor positivo máximo que int
puede contener es 2147483647
más allá del cual el valor va al otro extremo (es decir, comienza desde el extremo negativo). Puede comprenderlo en la siguiente demostración:
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);
}
}
Salida:
j=-2147483648
2147483647
-2147483648
-2147483648
-2147483647
-2147483646
Después de -2147483648
multiplicar por -1
, se convierte en 2147483648
pero una int
variable no puede contener este gran valor positivo; por lo tanto, comenzará desde el final negativo (es decir Integer.MIN_VALUE
).
El número 2147483648 no existe. El valor más grande de un int es 2147483647, que es 1 más pequeño que el resultado esperado. La multiplicación provoca un desbordamiento, que 'revierte' el número al valor negativo más pequeño y continúa el cálculo desde allí. (Con otras palabras: 2147483647 + 1 = -2147483648 (negativo más pequeño)) Dado que el resultado solo sería 1 sobre el valor máximo, no se requiere ninguna acción adicional y se devuelve el valor int mínimo.
Si desea solucionar este problema, use 'long' en lugar de 'int' para sus variables. También puede utilizar clases más complejas como BigDecimal o escribir una función de multiplicación personalizada para matrices de bytes.
Nota: no importa qué tipo numérico utilice, siempre que la memoria utilizada para representar el número sea finita, puede encontrarse con problemas similares. Aunque en circunstancias normales es poco probable, incluso para un entero de 32 bits (int).