Oprócz dotychczas udzielonych odpowiedzi ...
W sumie są cztery wartości
int i = Integer.MIN_VALUE;
long i = Long.MIN_VALUE;
Integer i = Integer.valueOf(Integer.MIN_VALUE);
Long i = Long.valueOf(Long.MIN_VALUE);
Opakowane wartości są rozpakowywane, więc są również prawdziwe dla tego wyrażenia.
Uwaga: dokumenty Math.abs.
public static int abs (int a)
Zwraca wartość bezwzględną wartości int. Jeśli argument nie jest ujemny, zwracany jest argument. Jeśli argument jest ujemny, zwracana jest negacja argumentu.
Zwróć uwagę, że jeśli argument jest równy wartości Integer.MIN_VALUE, czyli najbardziej ujemnej wartości typu int, wynikiem jest ta sama wartość, która jest ujemna.
i
publiczne statyczne długie mięśnie brzucha (długie a)
Zwraca wartość bezwzględną wartości długiej. Jeśli argument nie jest ujemny, zwracany jest argument. Jeśli argument jest ujemny, zwracana jest negacja argumentu.
Zauważ, że jeśli argument jest równy wartości Long.MIN_VALUE, czyli wartości długiej, która jest najbardziej ujemna do reprezentacji, wynikiem jest ta sama wartość, która jest ujemna.
Zaskakujące jest to, że Math.abs może zwrócić liczbę ujemną. Dzieje się tak, ponieważ a) nie ma dodatnich wartości -MIN_VALUE w tych przypadkach b) wykonanie- obliczeń skutkuje przepełnieniem.
Interesujące jest również to, dlaczego Byte.MIN_VALUE, Short.MIN_VALUE tego nie robią. Dzieje się tak, ponieważ -zmienia się typ naint na te, a zatem nie ma przepełnienia.
Character.MIN_VALUE nie ma problemu, ponieważ wynosi 0.
Float.MIN_VALUE i Double.MIN_VALUE mają inne znaczenie. Są to najmniejsze możliwe do przedstawienia wartości większe od zera. W ten sposób mają ważne wartości ujemne, które nie są sobą.