En plus des réponses données jusqu'à présent...
Il y a quatre valeurs au total
int i = Integer.MIN_VALUE;
long i = Long.MIN_VALUE;
Integer i = Integer.valueOf(Integer.MIN_VALUE);
Long i = Long.valueOf(Long.MIN_VALUE);
Les valeurs enveloppées sont déballées afin qu'elles soient également vraies pour cette expression.
Remarque : les documents Math.abs.
public static int abs(int a)
Retourne la valeur absolue d'un int valeur. Si l'argument n'est pas négatif, l'argument est retourné. Si l'argument est négatif, la négation de l'argument est retournée.
Notez que si l'argument est égal à la valeur de Integer.MIN_VALUE, la valeur int représentative la plus négative, le résultat est cette même valeur, qui est négative.
et
public static long abs(long a)
Renvoie la valeur absolue d'une valeur longue. Si l'argument n'est pas négatif, l'argument est retourné. Si l'argument est négatif, la négation de l'argument est retournée.
Remarquez que si l'argument est égal à la valeur de Long.MIN_VALUE, la valeur longue représentable la plus négative, le résultat est cette même valeur, qui est négative.
Il est surprenant que Math.abs puisse retourner un nombre négatif. Cela se produit soit parce que a) il n'y a pas de valeurs positives pour -MIN_VALUE dans ces cas-là b) l'exécution de la fonction -
le calcul aboutit à un dépassement de capacité.
Ce qui est également intéressant est de savoir pourquoi Byte.MIN_VALUE, Short.MIN_VALUE ne font pas cela. C'est parce que les -
change le type en int
pour ces derniers et donc pas de débordement.
Character.MIN_VALUE n'a pas de problème car il est égal à 0.
Float.MIN_VALUE et Double.MIN_VALUE ont une signification différente. Il s'agit de la plus petite valeur représentable supérieure à zéro. Elles ont donc des valeurs négatives valides qui ne sont pas elles-mêmes.