Negatif sayılarla Java Birden Çok İki sayı sorunu [yineleme]

Dec 16 2020

Son zamanlarda aşağıdaki problemle karşı karşıyayım

 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);
    }
}

Sonuç: -2147483648

Kodlu çevrimiçi IDE: https://paiza.io/projects/e/17lF_6-GltIcyubZv3QoFg?theme=twilight

Ama 2147483648 elde etmem gereken mantığa göre nasıl çalıştığı bir sonuç değil mi? O zaman bu negatif sayıyı nasıl elde ettim? Tamsayı aralığı (Integer.MIN_VALUE) nedeniyle mi? bu sorunu nasıl çözebilirim?

Yanıtlar

1 LiveandLetLive Dec 16 2020 at 03:10

Bir inttutabileceği maksimum postif değer 2147483647, değerin diğer uca gittiğinin ötesinde (yani negatif uçtan başlar). Aşağıdaki demodan anlayabilirsiniz:

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);
    }
}

Çıktı:

j=-2147483648
2147483647
-2147483648
-2147483648
-2147483647
-2147483646

Sonra -2147483648ile çarpılır -1, 2147483648ancak bir intdeğişken bu kadar büyük pozitif değeri tutamaz; yani, negatif uçtan (yani Integer.MIN_VALUE) başlayacaktır .

1 tibetiroka Dec 16 2020 at 03:09

2147483648 numarası mevcut değil. Bir int'in en büyük değeri 2147483647'dir ve bu, beklediğiniz sonuçtan 1 daha küçüktür. Çarpma, sayıyı en küçük negatif değere 'geri döndüren' ve hesaplamaya buradan devam eden bir taşmaya neden olur. (Başka bir deyişle: 2147483647 + 1 = -2147483648 (en küçük negatif)) Sonuç, maksimum değerin yalnızca 1 üzerinde olacağından, ek işlem gerekmez ve minimum int değeri döndürülür.

Bu sorunu düzeltmek istiyorsanız, değişkenleriniz için 'int' yerine 'long' kullanın. Ayrıca BigDecimal gibi daha karmaşık sınıfları kullanabilir veya bayt dizileri için özel bir çarpma işlevi yazabilirsiniz.

Not: Hangi sayısal türü kullanırsanız kullanın, sayıyı temsil etmek için kullanılan bellek sonlu olduğu sürece benzer sorunlarla karşılaşabilirsiniz. Normal koşullar altında, 32 bitlik bir tamsayı (int) için bile olası değildir.