Java Puzzle 19 – Increment till MAX_VALUE
Merhaba Arkadaslar
Hemen ornek kodumuzu inceleyelim ;
TillMaxValue.java
package _19.increment.max; public class TillMaxValue { public static final int END = Integer.MAX_VALUE; public static final int START = END - 100; public static void main(String[] args) { int count = 0; for (int i = START; i <= END; i++) count++; System.out.println(count); } }
Integer.MAX_VALUE ; 2147483647 degerine sahiptir. 100 cikartip START’a assign ediyoruz.
END ve START arasinda dongumuz kac kere donecektir ? count kac yazacaktir ?
END-START +1 = 101 yazmasini bekliyoruz fakat ornegi calistirirsak herhangi bir cikti yazmayacaktir.
Neden peki , cunku dongumuz sonsuz donguye girecektir ! Donguden cikis olamayacagi icin System.out.println hic calisamayacaktir.
Tum int degiskenleri her zaman Integer.MAX_VALUE den kucuktur ya da esittir.
Dolayisiyla <=END sarti her zaman true olacaktir. Donguden cikis olmayacaktir.
Sayimiz 2147483647 degerine ulastiginda bir sonraki iterasyon icin sayimiz negatife donecektir.
Dolayisiyla sayi negatif oldugu icin yine 2147483647 sayisindan kucuk olacaktir.
2147483647+1 --> -2147483648
Bu tarz sinirlarda/bounds ugrasiyorsak bu durumda dikkatli olmamiz gereklidir. Onceki yazilarda overflow durumlarini incelemistik.
Burada cozum icin int tipi yerine long kullanabiliriz.
TillMaxValueFixed.java
package _19.increment.max; public class TillMaxValueFixed { public static final int END = Integer.MAX_VALUE; public static final int START = END - 100; public static void main(String[] args) { int count = 0; // use long i intead of int i for (long i = START; i <= END; i++) count++; System.out.println(count); // Integer.MAX_VALUE = 2147483647 // for int type // 2147483647+1 --> -2147483648 (it is negative !) // for long type /// 2147483648 } }
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
Leave a Reply