Negatif sayılarla Java Birden Çok İki sayı sorunu [yineleme]
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
Bir int
tutabileceğ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 -2147483648
ile çarpılır -1
, 2147483648
ancak bir int
değişken bu kadar büyük pozitif değeri tutamaz; yani, negatif uçtan (yani Integer.MIN_VALUE
) başlayacaktır .
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.