Masalah Java Multiple Two number dengan angka negatif [duplikat]
Saya baru-baru ini menghadapi masalah di bawah ini
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);
}
}
Hasil: -2147483648
IDE online dengan kode: https://paiza.io/projects/e/17lF_6-GltIcyubZv3QoFg?theme=twilight
Tapi bagaimana cara kerjanya sesuai logika yang saya butuhkan untuk mendapatkan 2147483648 apakah hasilnya benar? Lalu bagaimana saya mendapatkan angka negatif ini? Itu karena rentang integer (Integer.MIN_VALUE)? bagaimana cara memperbaiki masalah ini?
Jawaban
Nilai postive maksimum yang int
dapat ditahan 2147483647
melampaui nilai tersebut menuju ke ujung lainnya (yaitu dimulai dari ujung negatif). Anda bisa memahaminya dari demo berikut:
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);
}
}
Keluaran:
j=-2147483648
2147483647
-2147483648
-2147483648
-2147483647
-2147483646
Setelah -2147483648
dikalikan dengan -1
, itu menjadi 2147483648
tetapi int
variabel tidak dapat menyimpan nilai positif sebesar ini; jadi, ini akan dimulai dari ujung negatif (yaitu Integer.MIN_VALUE
).
Nomor 2147483648 tidak ada. Nilai terbesar dari sebuah int adalah 2147483647, yang 1 lebih kecil dari hasil yang Anda harapkan. Perkalian menyebabkan luapan, yang 'memutar kembali' angka tersebut ke nilai negatif terkecil, dan melanjutkan penghitungan dari sana. (Dengan kata lain: 2147483647 + 1 = -2147483648 (negatif terkecil)) Karena hasilnya hanya 1 di atas nilai maksimum, tidak ada tindakan tambahan yang diperlukan dan nilai int minimal dikembalikan.
Jika Anda ingin memperbaiki masalah ini, gunakan 'long' daripada 'int' untuk variabel Anda. Anda juga dapat menggunakan kelas yang lebih kompleks seperti BigDecimal, atau menulis fungsi perkalian kustom untuk array byte.
Catatan: apa pun tipe numerik yang Anda gunakan, selama memori yang digunakan untuk merepresentasikan angka itu terbatas, Anda dapat mengalami masalah serupa. Meskipun dalam keadaan normal tidak mungkin, bahkan untuk integer 32-bit (int).