17:29 “Varsayımlarımı tekrar ediyorum:
- Matematik,doğanın dilidir.
- Etrafımızdaki her şey sayılarla tanımlanabilir ve anlamlandırılabilir.
- Herhangi bir sistemdeki sayıları grafikle gösterirseniz, şekiller ortaya çıkar. Bu nedenle, Doğada her yerde şekiller vardır.”
Pi filminden yaptığım bu alıntı, az çok bu ayki konumun ne olduğunu ima ediyor; bilgisayarlardaki sayı sistemi ve işleyişi. Özellikle bilgisayar söz konusu olduğunda her şeyin sayılardan ibaret olduğunu inkar etmek mümkün değil. Daha önce eminim duymuşsunuzdur: “Birler ve sıfırların dünyası” çok klasik değil mi? Ancak çok doğru. Bigisayardan beklenen her şey, daha doğrusu insanlar bilgisayara baktığında onlara anlamlı gelen her tülü veri (sayılar, yazılar, resimler, müzikler vs.) sayısal ifadeler olarak tutuluyor. Bütün girdi – çıktı, hatta bilgisayarın içindeki (dışarıdan bağımsız) işlemlerde de aktarılan tüm bilgi sadece sayılardan ibaret.
Hatırladığım kadarıyla sayılar kavramı soyut bir kavramdı. :) Peki o zaman her şeyin sayılardan ibaret olması gerçekte ne anlama geliyor. Aslında sayılar (veya bilgisayardaki yapıtaşı olan 1'ler ve 0'lar) bizim onlara bu anlamlardan birini yüklediğimiz fiziksel durumlardır. Bu bahsettiğim durumlar manyetik parçacıkların hafıza birimlerinde olup olmadığı ya da hangi doğrultuda olduğudur. Örneğin ram'de bir kapasitörün üzerinde yük olması 1, olmaması 0 olarak yorumlanırken bir sabit diskte bu yorumlama sabit disk üzerindeki manyetik parçacıkların belirli bir kutbunun aşağıda mı yoksa yukarıda mı olduğuyla belirlenir. İşte bu noktada bilgisayarların neden ikilik sistem kullandığına da biraz girmiş olduk. Değişebilmesi daha olası olduğu için ram'deki yöntemi ele alırsak yapabileceğimiz açıklama şudur. Kapastörün üzerindeki voltaj değerine göre 1 ve 0 dışında sayı bilgisi tutmak çok fazla zor gibi durmuyor (örneğin 0V => 0, +3V=> 1, +6V =>2 gibi ekstra anlamlar yüklenebilirdi voltajın değerine göre) ancak bu sistemlerin güvenilirliği ve maliyeti hesaba katıldığında ikilik sistemin en iyi seçenek olduğu görülüyor. İkilik sistemin bilgisayardaki aritmetiğine geçmeden önce sayıların nasıl sayı haricinde anlamları olduğundan kısaca bahsetmek istiyorum.
Makine dili olarak da bilinen assembly'de bütün komutların bire bir sayısal karşılıkları vardır. Buna benzer şekilde her dosyada da sayılar farklı anlamlar taşıyarak tutulabilir. Öyle ki, yeterince hastaysanız bir onaltılık editör kullanarak oluşturmak istediğiniz tüm dosyaları resim, müzik hatta programları sadece sayılar yazarak oluşturabilirsiniz. (Yalnız dikkat edin evde tek başınıza denemeyin :) önermiyoruz) İşte bahsettiğim komutların karşılıkları olan sayılara “operasyon kodu” denir ve bilgisayar bu sayılarla karşılaştığında hangi eylemi gerçekleştirmesi gerektiğini bilir. Bu sayede bir resim dosyasını açmasını gerektiğini okuduğu belli sayıları operasyon kodu olarak algıladığında anlarken, daha sonra ekranın hangi karesinde hangi renk olduğu bilgisini resim dosyasının içindeki sayıları farklı bir şekilde yorumlarak alacaktır. Bu bilgilere de ulaştıktan sonra ise yapması gereken resim dosyasında bulunan sayılara göre ekranın doğru karesinde doğru rengin gözükmesini sağlayacak sinyalleri monitöre yollamaktır. Ardından da artık bize anlamlı gelen bir görüntüyle karşılaşmış olacağız. Diğer veriler de buna benzer yöntemlerle karşımıza çıkar ve artık biz sayıları duyarız, sayılarla ateş ederiz, konuşuruz, sayılara güleriz...
Bu genel bilgilerin ardından artık sadece sayılara yoğunlaşıp bilgisayardaki ikilik sayı sisteminden ve işleyişinden bahsedebilirim. Aslında ele alacağım temel iki sayı gösteriminden ilki tam sayılar olacak ve matematikteki bilinen ikilik sistemle çok benzer bir yapıya sahip. Örnek vermek gerekirse aritmetik işlemler az sonra bahsedeceğim birkaç istisna dışında aynı bu tabloda olduğu gibi yapılmaktadır.
Normal ikilik sistemden farklarını söylemek gerekirse, iki önemli farktan ilkininin bilgisayarda sayının tasarımsal ve en nihayetinde de fiziksel bir sınırının oluşudur. Günümüz bilgisayarlarında bir tam sayının saklandığı hafıza boyutu genelde 4 byte = 32 bittir. Bunun bir bitini az sonra anlatacağım işaret biti olarak kullandığımızda gösterebileceğimiz tamsayı aralığının [-231, 231-1] = [-2147483648, 2147483647] olduğunu bulabiliyoruz. Yani aritmetik işlemimizin sonucu bu aralıkta kalmazsa işlemimiz hatalı sonuçlar verebilecektir. Tabi ki, daha büyük boyutta tam sayılar oluşturmak mümkün ancak şu anki 4 bytelık tam sayılar bize zamansal ve boyutsal açılardan daha uygun olduğu için özel çabalar harcanmadığında tam sayılar 4 byte civarında tutulur. İkinci önemli fark ise negatif sayılardadır. Bir sayının pozitif mi negatif mi olduğu bilgisi tutuluyorsa yani işaretli tam sayı ile bu bilgi de bir bit ile tutulur. Bu bilgi en yüksek değerlikli bitte tutulur ve bu bit 0 ise sayının pozitif, 1 ise negatif olduğu anlamına gelir. İşaretli tamsayılardaki en önemli nokta ise negatif sayıların gösterimidir. Az önce bahsettiğim işaret bitine ek olarak negatif sayıların gösterimindeki fark ikiye tümleyen biçiminde tutuluyor olmalarıdır. İkiye tümleyenin temel mantığı bir sayının pozitifiyle negatifinin toplamının 0 etmesidir. Ancak ikiye tümleyeni bulma yöntemini bu matematiksel işlem yerine uygulanması ve anlaşılması daha kolay olan bir yöntemle anlatacağım. Yöntem şöyle işlemektedir : öncelikle tüm bitlerin tersi alınır yani 1 ise 0, 0 ise 1 ile değiştirilir ve sonra elde edilen sayıya bir eklenir. Örnek vermek gerekirse, 8 bit ile gösterilen 14 sayısının negatifini bulalım 14 = (00001110)2 bu bytetaki tüm bitlerin tersi alınır. (11110001)2 ve bu sayıya bir eklenir (11110010)2 ve artık bu sayı -14'e eşit olarak yorumlanır. Bu noktada akıllara neden ikiye tümleyen metoduna ihtiyaç duyulduğu, neden bir sayının pozitifiyle negatifinin ikilik gösterimindeki tek farkeden bitin işaret biti olmadığı soruları gelebilir. Bu ihtiyaç da tamamen aritmetik operasyonların fiziksel uygulanmasının daha verimli gerçekleştirilmesine olan ihtiyaçtan doğmuştur.
Temel sayı gösterimlerinden şimdi bahsedeceğim ikinci gösterim ise kayan noktalı sayılar. Kayan noktalı sayılar bilgisayarda rasyonel sayılar göstermek için kullanılır ve çalışma prensibi sayıların bilimsel gösterimine çok benzer. Tabi ki, bu sefer taban 10 değil 2'dir ve bu yüzden sayının çarpanı da 10'un kuvvetleri olarak değil 2'nin kuvvetleri olarak ifade edilir. Onluk tabandaki bilimsel gösterimde noktanın solunda sıfır haricinde tek bir rakam bırakılması gibi burada da noktanın solunda sıfır haricinde tek bir rakam bırakılır ama bu durumda (ikilik sistemde) zaten tek mümkün rakam birdir, bu yüzden o sayı kullanılmaz zaten bir olarak alınır ve bu noktayı uygun yere kaydırma işlemi sonucunda 2'nin hangi kuvvetiyle çarpılması gerekiyorsa bu üst değerinin bellirli bir miktar fazlası hafızada saklanır.
Kayan noktalı sayıların hafızadaki gösterimi şu yapıdadır: ilk bit işaret biti, sonraki bit grubu üst, en son kalan bit grubuna da kesirli sayı diyebileceğimiz kısım (tam olarak, sayının bilimsel gösterimdeki noktanın sağında kalan kısım) yazılır. Sayının nasıl hesaplandığı belirli bir byte sayısı için anlatmam, kayan noktalı sayıların anlaşılmasını daha kolaylaştıracağı için örnekle açıklamakta fayda görüyorum. Örnek olarak tek duyarlılığa sahip bir kayan noktalı sayıyı ele alalım, tek duyarlı olması sayının 4 byteta tutulduğunu gösterir. İlk bit işaret bitidir, sonraki 8 bit üst+127'yi tutar ve geriye kalan 23 bitte de sayının kesirini tutar. Sonra sayı hesalanırken kesir en solunda noktadan sonra bir 1 daha olduğu varsayılarak o sayı 2 üzeri üst ile çarpılır ve işaret biti 1 ise -1 ile çarpılır. Sayının saklanırken üste 127 eklenmesinin sebebiyse tutulmak istenen sayının 2-127 ve 2128 mertebelerinde tutalabilmesidir. Yani sadece çok büyük değil aynı zamanda çok küçük sayılar için de kullanım sağlanmaya çalışılmıştır. Sayısal bir örnekle 01000000-00100000-00000000-000000000 sayısındaki ilk bit, işaret biti, 0 olduğu için sayımız pozitif sonraki 8 bitin ikilik sistemdeki değeri 128 ve bu sayıda üst +127 olduğu için üst =1 anlamına gelmektedir. Geriye kalan bitleri başına “1.” koyarak yazdığımızda kesirli sayının aslında 1.01 olduğunu görüyoruz ve 1.01 sayısını 21 ile çarptığımızda elde ettiğimiz sayı (10.1)2 oluyor yani ondalık sistemde 2.5'e denk geliyor. Bu sayılara kayan noktalı denmesinin sebebi, burada görüldüğü gibi noktanın sayının neresinde olduğu üst kısmında tutuluyor olmasından. Yani o üst kısmının değerine göre noktanın bulunduğu yer değişiyor olmasından. Kayan noktalı sayıların aritmetiği ise normal bilimsel gösterimdeki sayıların hesaplanmasından pek farklı değil. Kabaca söylemek gerekirse işlemin türüne göre üstler kendi aralarında kesirler kendi aralarında işleme tabi tutuluyor.
Başka bir yazıda görüşmek üzere...