Şimdi Ara

C'de sonsuza kadar tamsayı yazdırmak? (2. sayfa)

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
28
Cevap
0
Favori
3.778
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: önceki 12
Sayfaya Git
Git
Giriş
Mesaj
  • quote:

    Orijinalden alıntı: OnurJAM

    Seninle daha fazla tartışmıycam, for döngüsünü öğrenmeye çalışan adama int overflow biliom ben ya ya tarzı mesajlar atarsan yediğin küfürle kalırsın.

    Hocam, tartışmayı başlatan sensin, durduk yerde mesajlarımıza laf etmeye başladın, düzgün bir dille "yanlış anlamışsınız, doğrusu böyle" diyebilirdin, şimdi de daha fazla tartışmıycam diye kapatmaya çalışıyorsun olayı, kimse de burda "hehehe ben biliyorum, başka kimse bilmiyor" tarzında mesajlar yazmıyor, senin dışında.
  • Sabahtan aksama kadar oturup üc kurusluk adamlarla tabii ki agız dalaşı yapmam kusura bakma. skoylunun gördüğüm mesajlarının tamamı bu tarzda, kendi kendini poh pohlayan adamların arada gazını alıp egosunu bosaltmak iyidir. Daha yaralı parmağa işememiş, bir iki bilgisiyle kendini Dennis Ritchie sanan adam gelip de arkadaşa yardım etmeye çalışanlara tepeden bakan tarzda mesajlar yazmasına seyirci kalmam.
  • Cahillik zor zenaattır onurjam, seni anlıyorum, hiç merak etme. En iyisi git kulübende uzan, yıldılzarı seyretmek için akşam bekle sen, boşver ötesini.. Zira konuştukça daha çok batıyorsun..
  • Arkadaşlar birşey soracağım, bir veri tipi maksimum alacağı değeri aştıktan sonra negatif maksimum değere mi döner yoksa 0 a mı ??
  • Ahah kavga edilen konuya bak :) Microsoft'un işe alırken sorduğu sorulardan birisi bu sonsuza kadar sayı yazdırmak işi. Ama gerçekten sonsuza kadar :)
  • Afedersiniz ama başvurdunuz da mı biliyosunuz ??? Peh...

    Sonsuza kadar sayı yazdırma, eğer her basamak için farklı bir değişken yaratılırsa hiç de imkansız olacağını sanmıyorum. Elbette ki bir yolu vardır fakat "sonsuza" kadar olmasa da kapasitenin sonuna kadar zorlanabilir. Ona bakarsınız "Gugıl işe alırken bunu sorayo" "Bilmemne işe alırken bunu sorayyo" diye ortaya laf atan klavye delikanlıları da var, eğer bunlardan birine inanıp da buraya yazdıysanız lütfen bir daha düşünün derim. Fakat gerçekten kanıtınız var ise de birşey diyemeyeceğim fakat böyle bir uygulama yaptıracaklarını sanmıyorum.
  • Python dilinde tamsayılar teorik olarak sonsuz uzunlukta olabilirler. Ama pratikte bu elbette sistem kaynakları ile sınırlıdır.

    Bu bize şunu gösterir: Bu meseleyi merak eden kişi, python kaynak kodunu indirip meseleyi öğrenebilir.

    C/C++ dillerinde bir veri tipinin alabileceği değerler, o veritipinin bellekte işgal ettiği alanla orantılıdır. Velkain bu dillerin doğası gereği, veritiplerini iki şekilde düşünmek gerekir. Dilin sunduğu veritipleri, kullanıcı tanımlı veri tipleri. Bu noktada dilin yerleştirildiği seviye, yer neyse düşünülünce, şöyle bir çıkarıma ulaşmak mümkündür: C Dilinde, veri tipleri işlemcinin işleyebildiği verilerden ibarettir. Örneğin, 32 bitlik bir işlemci, 32 bitlik verileri işleyebilir. Bunun dışındaki her türlü veri, kullanıcı tanımlı veriler olacaktır.

    Burada kavram kargaşası yaratacak olan bir husus şu. 32 bitlik işlemcilerin, 8, 16 ve 32 bit veri işlemesi mümkündür, yukarda sadece örnek verdik. Bugün, matematik işlemciler vs. sayesinde 80 bitlik veri vs. de işleyebilir. Bir diğer örnek olarak, Z80 8 bit bir işlemci olmakla birlikte, h, l gibi registerlerini birarada kullanıp 16 bit işlem yapabilir.

    Bundan çıkacak olan netice şudur: C dilinde veritipleri, yani temel veritipleri ki, char ve int'ten ibarettir aslen, opak bir yapı olarak düşünülmüştür. Örneğin bir tamsayı, yani "int", farklı mimari -ve derleyicilerde- farklı limitlerde olabilir. Bu nedenle, types.h gibi kullanıcı tanımlarıyla, u_int32t gibi her ortamda 32 bit olacak kullanıcı tanımlı veriler belirtilmiştir.

    Bu verilerin işlenirken nasıl düşüneleceği ise gene veri tipine bağlıdır. Fakat, C dilindeki i++ işlevi basitçe makine dilindei "inc i", yani "increment i" anlamını taşır. Bu da mutlak bir operasyondur ve pek çok mimaride carry flag'ın registerin son biti olarak uygulanması ile birlikte değerlendirilir.

    Kısaca söylemek gerekirse, pek çok mimari için, INT_MAX (bkz: limits.h) değerinde ulaşmış bir int için bir artır işleminde, şu şekilde bir sonuç ortaya çıkar:

    Eğer sayı (tamsayı) işaretli ise, bu sadece sayının karşılaştırma işlevinde bir anlam taşır ve işaretsiz gibi işlenir. Sayının işaretli olup olmaması Bu durumda sayı mutlak değerinin bir fazlasına çıkarılır. Eğer bu değer, sayının saklama alanından büyükse o zaman taşma bayrağı kalkar ve sayının değeri sıfır olur.

    Eğer sayı işaretli ve mimaride negatif sayılar ikinin tümleyeni olarak işleniyorsa, o zaman bu sayı o türün alabileceği en küçük negatif (mutlak değeri en büyük) sayı olacaktır.

    Basitlik için int yerine char düşünelim. işaretli char, -128 .. 0 .. 127 arası sayıları alabilir. Bu 8 bitlik bir alana tekabül eder. Bu alanda 0 ... 255 arası değerler olabilir. Eğer siz 127 olan değeri bir artırırsanız, -128 değerini elde edersiniz. Artırmaya devam ettikçe, -1'e ulaşırsınız, Gene artırdığınızda ise 0'a erişirsiniz.

    char yerine unsigned char, yani işaretsiz sayı olursa, 127'den sonra 128'e ulaşırsınız. Devam ederseniz, 255'e ulaşıp bir sonraki sayı olarak 0'a dönersiniz.

    Kısaca, işlem yapılırken makinedeki flipfloplar'ın vs. sözü geçer C dilinde. Sizin "unsigned int" ve "int" değerleriniz makine (ve C dili için) aynı şeydir. Fakat karşılaştırma vs. yapılırken dil bunu anlar ve buna göre bir yöntem uygular.

    Bu konu gerçekten önemli bir konudur. Söylediğim gibi, tamsayı ile işaretli sayının karıştırılması sıkça yapılan bir hatadır. Bu meseleyi kavramak C'yi öğrenmenin bir hayli önemi bir yekününü teşkil eder.

    Umarım doğru ifade edebilmişimdir.




  • quote:

    Orijinalden alıntı: AlperXp

    Afedersiniz ama başvurdunuz da mı biliyosunuz ??? Peh...

    Sonsuza kadar sayı yazdırma, eğer her basamak için farklı bir değişken yaratılırsa hiç de imkansız olacağını sanmıyorum. Elbette ki bir yolu vardır fakat "sonsuza" kadar olmasa da kapasitenin sonuna kadar zorlanabilir. Ona bakarsınız "Gugıl işe alırken bunu sorayo" "Bilmemne işe alırken bunu sorayyo" diye ortaya laf atan klavye delikanlıları da var, eğer bunlardan birine inanıp da buraya yazdıysanız lütfen bir daha düşünün derim. Fakat gerçekten kanıtınız var ise de birşey diyemeyeceğim fakat böyle bir uygulama yaptıracaklarını sanmıyorum.


    Evet birlikte çalıştığım iş arkadaşlarımdan birisine sordular. Linked list kullanarak (her max int dolduğunda yeni bir node yaratıp alanı genişleterek) yaptım dedi ama sonuç olarak giremedi.




  • 
Sayfa: önceki 12
Sayfaya Git
Git
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.