2012-09-21 29 views
14

tengo un examen mañana y no puedo entender mi libros de explicación, aprecio la ayuda:Java enteros MIN_VALUE negativo luego comparar

public class TestClass{ 
     public static void main(String[] args) throws Exception{ 
      int a = Integer.MIN_VALUE; 
      int b = -a; 
      System.out.println(a+ " "+b); 
     } 
} 

Salida: -2147483648 -2147483648

¿Por qué esta impresión 2 números negativos de la misma magnitud y no una positiva y negativa?

Respuesta

30

Debido a desbordamiento de enteros en silencio: Integer.MIN_VALUE es -2^31 y Integer.MAX_VALUE es 2^31-1, por lo -Integer.MIN_VALUE es 2^31, que es Integer.MAX_VALUE + 1, que por definición es demasiado grande para un entero. Por lo tanto, se desborda y se convierte en Integer.MIN_VALUE ...

También puede comprobar que:

System.out.println(Integer.MAX_VALUE + 1); 

impresiones de la misma cosa.

Más técnicamente, el resultado se define por la Java Language Specification #15.18.2:

Si un desbordamientos de adición de número entero, entonces el resultado es los bits de orden bajo de la suma matemática como se representa en algunos suficientemente grande formato de complemento a dos . Si se produce un desbordamiento, entonces el signo del resultado no es el mismo que el signo de la suma matemática de los dos valores de operando.

+0

¡Eso fue rápido y preciso! –

+0

Ah mi libro me dio una explicación en binario, prefiero esta explicación que puedo entender más fácil. Muy apreciado. – Quinma

+1

Otra forma de darse cuenta de este problema es cuando se usa 'Math.abs()'. 'Math.abs (Integer.MIN_VALUE) == Integer.MIN_VALUE' – whiskeyspider

3

Básicamente, porque en realidad sólo es Integer.MAX_VALUE 2147483647, por lo -Integer.MIN_VALUE, lo que sería 2147483648, en realidad desborda la capacidad de la representación binaria interna de números enteros. Por lo tanto, el resultado "regresa" a Integer.MIN_VALUE, o -2147483648.

En cambio, si hiciera long b = -((long)a);, obtendría el resultado esperado.

1

Para mostrar esto aún más claramente:

<br> 
Integer.MIN_VALUE is -2^31 = -2147483648<br> 
Integer.MAX_VALUE is 2^31-1 = 2147483647 
/*notice this is 1 less than the negative value above*/ 
<br> 

1Integer.MAX_VALUE no puede tomar 2147483648. Este es un número demasiado grande para entero con exactamente 1. Esto hace que el número retroceda en la escala desde el valor máximo hasta el poing inicial, que es el valor mínimo.