Masalah Java Multiple Two number dengan angka negatif [duplikat]

Dec 16 2020

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

1 LiveandLetLive Dec 16 2020 at 03:10

Nilai postive maksimum yang intdapat ditahan 2147483647melampaui 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 -2147483648dikalikan dengan -1, itu menjadi 2147483648tetapi intvariabel tidak dapat menyimpan nilai positif sebesar ini; jadi, ini akan dimulai dari ujung negatif (yaitu Integer.MIN_VALUE).

1 tibetiroka Dec 16 2020 at 03:09

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).