Problema de Java Multiple Two con números negativos [duplicado]

Dec 16 2020

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

1 LiveandLetLive Dec 16 2020 at 03:10

El valor positivo máximo que intpuede contener es 2147483647má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 -2147483648multiplicar por -1, se convierte en 2147483648pero una intvariable no puede contener este gran valor positivo; por lo tanto, comenzará desde el final negativo (es decir Integer.MIN_VALUE).

1 tibetiroka Dec 16 2020 at 03:09

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