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 encapsulées sont déballées et sont donc également vraies pour cette expression.
Remarque: documents Math.abs.
public static int abs (int a)
Renvoie la valeur absolue d'une valeur int. Si l'argument n'est pas négatif, l'argument est renvoyé. Si l'argument est négatif, la négation de l'argument est renvoyée.
Notez que si l'argument est égal à la valeur de Integer.MIN_VALUE, la valeur int représentable la plus négative, le résultat est la même valeur, qui est négative.
et
public statique long abs (long a)
Renvoie la valeur absolue d'une valeur longue. Si l'argument n'est pas négatif, l'argument est renvoyé. Si l'argument est négatif, la négation de l'argument est renvoyée.
Notez 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 la même valeur, qui est négative.
Il est surprenant que Math.abs renvoie 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 b) l'exécution du -calcul entraîne un débordement.
Ce qui est également intéressant, c'est pourquoi Byte.MIN_VALUE, Short.MIN_VALUE ne le font pas. Ceci est dû au -fait que le type change intpour ceux-ci et donc aucun 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. Ainsi, ils ont des valeurs négatives valides qui ne sont pas elles-mêmes.