Javadaki Long Tipi
-
Arkadaslar
Javadaki long tipinin aldigi maks deger 9223372036854775807.
Simdi ben veri tiplerini incelerken soyle bisey yazdim.
long long_num = (long)10e95; System.out.println(long_num)
Burada long degiskenine 10x10^95 degeri vermiyor mu ? Bu sayi bundan buyuk degil mi ? Hemde kat kat... (benmi yanlis biliyorum )
Compile ediyorum. Calistiriyorum ve aldigim cikti 9223372036854775807.
OverflowException vermesi gerekmez mi ? Neden boyle yapiyor ?
Biri aydinlatirsa sevinirim.
-
https://dzone.com/articles/overflow-and-underflow-data
Hocam linkteki makalede yazdığına göre jvm tarafından herhangi bir warning yada exception üretilmiyor.
-
herhangi bir warning vermiyor mu?
-
turun max min ogrenmek istiyorsan wrapperlerinin max min methodlarini kullanabilirsin kullanabilirsin
System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);
edit : Burdanda yazim implicit ve explicit tur donusumlerini javada inceleyebilirsin.
Absolut tarafından 03/Oca/16 23:03 tarihinde düzenlenmiştir -
çoğu dilde yaptığın işlemler neticesinde overflow var mı diye kontrol edilmez pahalı bi işlem olduğu için. o long'u zilyon tane işlemden geçirebilirdin ve her birinde kontrol etseydi performans sıkıntısı gözle görülür olurdu.
bu yüzden senin değerleri karşılaştırıp overflow/underflow var mı kontrol etmen gerekiyor. genelde generic library'ler kullanılıyor bu tarz işler için mesela guava var, onda primitives package'ı var onda bu tarz işlemler için basit helper methodları var. örnek olarak Ints.checkcast'a bakabilirsin. http://docs.guava-libraries.googlecode.com/git/javadoc/src-html/com/google/common/primitives/Ints.html#line.87
-
Buremba bunu yazdı
çoğu dilde yaptığın işlemler neticesinde overflow var mı diye kontrol edilmez pahalı bi işlem olduğu için. o long'u zilyon tane işlemden geçirebilirdin ve her birinde kontrol etseydi performans sıkıntısı gözle görülür olurdu.
bu yüzden senin değerleri karşılaştırıp overflow/underflow var mı kontrol etmen gerekiyor. genelde generic library'ler kullanılıyor bu tarz işler için mesela guava var, onda primitives package'ı var onda bu tarz işlemler için basit helper methodları var. örnek olarak Ints.checkcast'a bakabilirsin. http://docs.guava-libraries.googlecode.com/git/javadoc/src-html/com/google/common/primitives/Ints.html#line.87
tamamda bu overflow olayları compile edilirken incelenmiyo mu kod optimize yapılırken.
mesela kullanmadığın bi değişkeni derlemeyen compiler, sayı overflow olunca hata yada warning verebilir.kod hızlı compile edilse ne olur yavaş edilse ne olur. önemli olan çalışırken ki hızı değil mi?
bu arada java bilgim sıfır.
-
iQsuz bunu yazdıBuremba bunu yazdı
çoğu dilde yaptığın işlemler neticesinde overflow var mı diye kontrol edilmez pahalı bi işlem olduğu için. o long'u zilyon tane işlemden geçirebilirdin ve her birinde kontrol etseydi performans sıkıntısı gözle görülür olurdu.
bu yüzden senin değerleri karşılaştırıp overflow/underflow var mı kontrol etmen gerekiyor. genelde generic library'ler kullanılıyor bu tarz işler için mesela guava var, onda primitives package'ı var onda bu tarz işlemler için basit helper methodları var. örnek olarak Ints.checkcast'a bakabilirsin. http://docs.guava-libraries.googlecode.com/git/javadoc/src-html/com/google/common/primitives/Ints.html#line.87
tamamda bu overflow olayları compile edilirken incelenmiyo mu kod optimize yapılırken.
mesela kullanmadığın bi değişkeni derlemeyen compiler, sayı overflow olunca hata yada warning verebilir.kod hızlı compile edilse ne olur yavaş edilse ne olur. önemli olan çalışırken ki hızı değil mi?
bu arada java bilgim sıfır.
aslında java ile pek alakası yok bu şekilde olmayan bir dil yok benim bildiğim. iki çeşit analiz şekli var biri static biri runtime. compiler static analysis olayını yapabiliyor sadece ama runtime olayını yapamıyor doğal olarak simulasyon falan yapması lazım ki onu da unit test yazarak yazılımcının yapması lazım. eğer sen kodun içerisinde bir long tanımlayıp değerine de long olamayacak birşey atarsan compiler hata verir normal şartlar altında. 10e95 aslında değeri double olan bir sayı, sen
doublelong_num =10e1595;yaparsan compiler'ın hata vermesi lazım.arkadaşın yaptığı ise statik bir değeri alıp long'a cast etmek yani biraz daha kompleks. compiler aslında bu durumda da hata verebilir, vermesi lazım ama demek ki o kadar zeki değil. ama genel olarak dışardan input alıp da çok rahat overflow yapabileceğin için compiler'lar bu işi yazılımcıya bırakıyorlar çünkü işi tam olarak çözemeyeceklerini bildikleri için o kadar kasmıyorlar anladığım kadarıyla.
benim de compiler'lar hakkında bilgim sınırlı ama stackoverflow'da sorulabilir bir soru javac 1.8 bile hata vermiyor arkadaşın yazdığı koda.
-
hatta merak ettim eğer arkadaşın izni varsa stackoverflow'da sorabilirim soruyu. aslında o kadar da kompleks bir ifade değil java'nın bunu anlaması lazım normalde static analysis yaparken, altında başka bir sebep yatıyor olabilir.
-
Java'da bu konuda C / C++'ın izinden gitme durumu var (acı şekilde öğrendim). Bu ne performans ne başka bir konu ile ilgili, tamamen tasarım icabı.
Kontrol etmek sizin sorumluluğunuzda.
-
Buremba bunu yazdı
hatta merak ettim eğer arkadaşın izni varsa stackoverflow'da sorabilirim soruyu. aslında o kadar da kompleks bir ifade değil java'nın bunu anlaması lazım normalde static analysis yaparken, altında başka bir sebep yatıyor olabilir.
hocam bu isin izni mi olur :) sor tabi.
-
ddetayli yazacagim. mobildeyim.
int tipinde overflow varsacompile etmiyor.
sanirsam longda da 10e400 koyuncs compile etmedi cast isslemiyle.
absolut arkadsin dedigine gore java burada cast ederken verilen degerden alabildigi kdr aliyormus. yani maks degeri aliyor ve gerisi kaliyot.
yazacam sonra
