Java Puzzle 03 – Overflow

Merhaba Arkadaslar,
2  long tipinde degisken uzerinde carpma ve bolme islemleri yapacagiz.

LongDivision.java

package _03.overflow;

public class LongDivision {

	public static void main(String[] args) {
		final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
		final long MILLIS_PER_DAY = 24 * 60 * 60 * 1000;

		System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);
	}
}

long veri tipi 64 bittir, bu nedenle (-2^63) ile (2^63)-1 arasinda deger alabilir.
Kodu calistirdigimizda sonucun 5 oldugunu gorururuz. Bunun nedeni MICROS_PER_DAY degiskenin degeri long icin uygunken bu deger int tipinin sinirlari disinda olacaktir. Benzer sekilde int tipi 32 bittir , (-2^31) ile (2^31)-1 arasinda deger alabilir.

Java’da tamsayi literaller varsayilan olarak int tipindedir. Bu nedenle kullandigimiz sayilarin her biri int tipindedir (24 , 60 ,1000 ). Carpma islemi yapildiginda bu islem int tipine gore yapilacaktir. Dolayisiyla MICROS_PER_DAY hesaplanirken sonuc yanlis hesaplanacaktir. Islemin sonucu int tipinin disinda kalacaktir. (overflow)

Bu sorunu cozmek icin long literal kullanabiliriz.

public class LongDivision {

	public static void main(String[] args) {

		final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
		final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000;

		System.out.println(MICROS_PER_DAY);
		System.out.println(MILLIS_PER_DAY);
		System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);

	}
}

Degiskenlerimiz hesaplanirken baslangicta “L” literalini kullandik ve 24’un int degil “long” tipinde oldugunu belirttik. Sonrasinda gelen sayilar int olsa da islemin sonucu yukseltilir ve long olur. Bu durum Java’nin bir ozelligidir.

LongDivisionFixed.java

package _03.overflow;

public class LongDivisionFixed {
	
	public static void main(String[] args) {
		
		final long MICROS_PER_DAY = 24L * 60 * 60 * 1000 * 1000;
		final long MILLIS_PER_DAY = 24L * 60 * 60 * 1000;

		System.out.println(MICROS_PER_DAY / MILLIS_PER_DAY);

	}
}

Bu kucuk kod orneginden cikaracagimiz sonuc, buyuk sayilarla calistigimizda , islemlerin degisken tipinin sinirlarini asma durumununa (overflow) dikkat etmemiz gerekir.

Bununla birlikte Java’ya ilerleyen zamanlarda bu tarz overflow durumlarinda exception firlatma ozelligi gelse daha guzel olabilir. Sonucta belli bir noktada long veritipinin de siniri asilacaktir , bu noktada java.math.BigDecimal kullanmak gereklidir.

Yazimi burada sonlandiriyorum.
Herkese bol Javali gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *