- BİLGİSAYAR SİSTEMLERİNDE VERİ GÖSTERİMİ
Giriş
Herhangi bir bilgisayarın organizasyonu, büyük ölçüde sayıları, karakterleri ve kontrol bilgilerini nasıl gösterdiğine bağlıdır. Yıllar boyunca oluşturulan standartlar bilgisayar organizasyonuna yön vermiştir. Bu bölüm de, bilgisayarların sayıları ve karakterleri nasıl depoladığı ve değiştirdiği açıklanmaktadır. Burada sunulan fikirler, her tür dijital sistemin organizasyonunu ve işlevini anlamak için temel oluşturur.
Dijital bir bilgisayardaki en temel bilgi birimi, binary digit kelimelerinden türetilen bit dir. Somut anlamda, bir bilgisayar devresi için “açık” veya “kapalı” (veya “yüksek” ve “düşük”) olma durumudur. 1964’te, IBM System/360 bilgisayarının tasarımcıları, bilgisayar depolamasının temel birimi olarak 8 bitlik grupları kullanma kararı verdi ve bu 8 bitlik gruba bayt adını verdiler.
Bilgisayar sözcükleri-kelimeleri iki veya daha fazla bitişik bayttan oluşur. Kelime boyutu, belirli bir mimari tarafından en verimli şekilde işlenen veri boyutunu temsil eder. Kelimeler, 16 bit, 32 bit, 64 bit veya bir bilgisayarın organizasyonu bağlamında anlamlı olan başka herhangi bir boyut olabilir (sekizin katları olmayan boyutlar dahil). Sekiz bitlik bayt, yarım bayt (nibbles) adı verilen iki adet 4 bitlik yarıya bölünebilir. Bir baytın her biti, konumuna göre bir değere sahip olduğundan, en az değerli ikili basamağı içeren yarım bayt, düşük dereceli yarım bayt, diğer yarısı ise yüksek dereceli yarım bayt olarak adlandırılır.
2.1. Sayı Sistemleri
Avrupa, on altıncı yüzyılın ortalarında, Arapların ve Hinduların neredeyse bin yıldır kullandıkları ondalık (veya 10’lu taban) numaralandırma sistemini benimsedi. Bugün, 345 sayısının üç yüz, artı dört onluk, artı beş birlik anlamına geldiğini kabul ediyoruz. Sıfırın “hiçbir şey” anlamına gelmediği gerçeğine rağmen, hemen hemen herkes bir şeyden 1’ine sahip olmak ile bir şeyden 10’una sahip olmak arasında önemli bir fark olduğunu bilir.
Sayı tabanının arkasındaki genel fikir, sayısal bir değerin bir tabanın artan kuvvetleri aracılığıyla temsil edilmesidir.
Bir sayı tabanı sistemi için geçerli sayılar kümesi, boyut olarak o sistemin tabanına eşittir. Örneğin, ondalık sistemde 10 hane vardır ve 0 ila 9 rakamlarından oluşur. Üçlü (taban 3) sistem 0, 1 ve 2 rakamlarından oluşur ve 3 hanesi vardır. Her hangi bir taban da geçerli olan en büyük sayı, tabandan bir küçük olan sayıdır, bu nedenle 8, 9’dan küçük herhangi bir taban sisteminde geçerli bir sayı değildir. Farklı tabanlardaki sayıları ayırt etmek için, örneğin ondalık sayı olarak kabul edilen 26 sayısını temsil etmek için 2610 gibi bir alt simge olarak tabanı gösteririz.
Bilgisayar biliminde ki en önemli iki sayı sistemi ikili taban (binary ) ve onaltılı tabandır (hexadecimal). Diğer bir sayı tabanı ise sekizlik’dir. İkilik sistemde yalnızca 0 ve 1 rakamları kullanılır. Sekizlik sistemde 0’dan 7’ye kadar ve onaltılık sistemde 0’dan 9’a kadar rakamlarla birlikte 10 ile 15 arasını göstermek için A, B, C, D, E, F harfleri kullanılır.
2.2. 10luk 2lik Dönüşümleri
Gottfried Leibniz (1646-1716) ikilik taban fikrini ortaya atan ilk kişiydi. Derin ruhani inançları olan biri olan Leibniz, ilahi nitelikleri ikili sisteme atfetti. Herhangi bir tamsayının bir dizi birler ve sıfırlarla temsil edilebileceği gerçeğini, Tanrı’nın (1) evreni yoktan yarattığı (0) fikriyle ilişkilendirdi. İlk ikili dijital bilgisayarlar 1940’ların sonlarında inşa edilene kadar, bu sistem matematiksel bir meraktan başka bir şey değildi. Ancak bugün dijital kontrollere dayanan hemen hemen her elektronik cihazın kalbinde yatmaktadır.
Basitliği nedeniyle, ikili numaralandırma sistemi kolayca elektronik devreye çevrilebilir. İnsanların anlaması da kolaydır. Deneyimli bilgisayar uzmanları küçük ikili sayıları (Şekil 2.1’de gösterilenler gibi) bir bakışta tanıyabilir. Daha büyük değerleri ve kesirleri dönüştürmek genellikle bir hesap makinesi veya kalem ve kâğıt gerektirir. Neyse ki, dönüştürme tekniklerinde biraz pratikle ustalaşmak kolaydır. Aşağıdaki bölümlerde daha basit tekniklerden birkaçını göstereceğiz.
2.2.1. İşaretsiz Tam Sayıları Dönüştürme
İşaretsiz sayıların temel dönüşümünü anlamakla başlayalım. İşaretli sayıların (pozitif veya negatif olabilen sayılar) dönüştürülmesi daha karmaşıktır bu yüzden işaretli sayılarla çalışmaya başlamadan önce temel dönüştürme tekniğini anlamanız gereklidir.
Sayı tabanları arasında dönüşüm, tekrarlı çıkartma veya kalanlı bölme yöntemi kullanılarak yapılabilir. Tekrarlı çıkartma yöntemi zahmetlidir ve kullanılan tabanın kuvvetlerine aşina olmayı gerektirir. İki yöntemden ilki olan çıkartma yöntemini açıklamakla başlayalım.
Örnek olarak, 10410‘u taban 3’e dönüştürmek istediğimizi varsayalım. 34 = 81 ‘in 3’ün 104’ten küçük en büyük kuvveti olduğunu biliyoruz. Buradan 3 tabanındaki sayımızın 5 basamaklı olacağını söyleyebiliriz (Üs değeri 4 olduğu için 0’dan 4’e kadar her değer için bir basamak alır). 104’ten 81 bir kere çıkarılabilir ve geriye 23 kalır. 3’ün diğer kuvveti olan 33 = 27 önceki işlemden gelen fark sayısı 23’ten büyüktür ve çıkarılamaz. Bu yüzden 0 yazıp bir sonraki adımda 23’ün 32 = 9’a kaç kere bölündüğüne bakarız. 2 kere bölündüğü için 2×32=18 çıkarırız. Kalan 5’ten 31 = 3’ü çıkarttığımızda fark 2’dir ve buradan 2×30=2’yi çıkardığımızda 0’a ulaşırız. Bu adımlar Örnek 2.1’de gösterilmektedir.
Örnek 2.1
Kalanlı bölme yöntemi, tekrarlı çıkarma yönteminden daha hızlı ve kolaydır. Bu yöntemde sayı ve sonraki aşamalarda bölümleri sürekli olarak tabana bölünüp kalanları bulunur. Sırayla tabana göre böldüğümüzde elde ettiğimiz kalanlar, sonuçta aşağıdan yukarıya doğru sıralandığında bulunan sayı 3 tabanındaki sayımız olur. Bu yöntem Örnek 2.2’de gösterilmektedir.
Örnek 2.2
104 3’e 34 defa bölünür ve kalan 2’dir.
34 3’e 11 defa bölünür ve kalan 1’dir.
11 3’e 3 defa bölünür ve kalan 2’dir.
3 3’e 1 defa bölünür ve kalan 0’dır.
1 3’e 0 defa bölünür ve kalan 1’dir.
Kalanları aşağıdan yukarı sıraladığımızda 102123 = 10410 buluruz.
Bu yöntem her tabanda uygulanabilir ve hesaplamaların basitliğinden dolayı, özellikle ondalıktan ikiliye dönüştürmede yararlıdır.
İkilik tabandaki n bitli bir sayı, 0 ile 2n-1 arasındaki işaretsiz tam sayıları temsil edebilir. Örneğin, 4 bit onluk tabanda 0 ile 15 arasındaki değerleri temsil ederken 8 bit, 0 ile 255 arasındaki değerleri temsil edebilir. Bit sayısı ile temsil edilen değerler aralığı, ikili sayılar üzerinde aritmetik işlemler yaparken son derece önemlidir. Örneğin 4 bit uzunluğunda olan 11112‘yi (1510) sayısını kendisi ile toplayalım. 15 artı 15’in 30 olduğunu biliyoruz, ancak 30 sadece 4 bit kullanılarak gösterilemez. İşaretsiz ikili tabanda bir aritmetik işlemin sonucu, verilen bit sayısı için izin verilen aralığın dışında kalırsa bu durum taşma olarak adlandırılır.
2.2.2. Kesirleri Dönüştürme
Herhangi bir tabandaki kesirler, bir tabanın negatif üsleri kullanılarak başka bir tabana dönüştürülebilirler. Kesir işareti bir sayının tamsayı kısmını kesirli kısmından ayırır. Onluk tabanda, kesir işareti ondalık işareti olarak adlandırılır. İkilik tabanda kesirler ikilik işarete sahiptir.
Bir tabanda kesir işaretinin sağında yinelenen rakamlar içeren kesirler, başka bir tabanda yinelenen rakamlara sahip olmayabilir. Örneğin bir devirli ondalık kesirdir, ancak üçlük taban sisteminde olarak gösterilir.
Tam sayıları dönüştürmek için tekrarlanan çıkarma veya kalanlı bölme yöntemlerine benzer yöntemler kullanarak kesirleri farklı tabanlar arasında dönüştürebiliriz. Örnek 2.3, bir sayıyı ondalıktan 5 tabanına dönüştürmek için tekrarlı çıkarmayı nasıl kullanabileceğimizi gösterir.
Örnek 2.3
sayısını 5 tabanında gösterelim.
Baştan sona doğru yazarsak buluruz.
Tamsayılar kalanlı bölme yöntemi ile dönüştürülürken sayının tabana bölündüğünü biliyoruz. Kesirleri dönüştürmek için ise kesir işaretinden sonraki kısım dönüştürülecek taban ile çarpılır. Bununla birlikte, yukarıda yaptığımız gibi kalanlar yerine, taban ile çarpıldıktan sonra çarpımın yalnızca tam sayı kısmını kullanırız. Cevap, önceki yöntemdeki gibi aşağıdan yukarıya değil, yine yukarıdan aşağıya doğru yazılır. Örnek 2.4, süreci göstermektedir.
Örnek 2.4
sayısını 5 tabanında gösterelim.
Kesirli kısım artık sıfır, yani işimiz bitti.
Tam sayı kısmını baştan sona doğru yazarsak buluruz.
Dönüştürme işlemi sırasında çoğu zaman işlem sonrasında kesirler tekrarlanır. Bu durumda dönüştürme işlemi birkaç adımdan sonra durdurulabilir Çoğu bilgisayar sistemi, tahmin edilebilir bir doğruluk derecesi sağlamak için özel yuvarlama algoritmaları uygular. Örnek 2.5’te gösterildiği gibi, istenen doğruluk elde edildiğinde işlem durdurulabilir.
Örnek 2.5
sayısını virgülden sonra 4bit olacak şekilde 2 tabanında gösterelim.
Bu bizim dördüncü parçamız. Burada duracağız.
Tam sayı kısmını baştan sona doğru yazarsak buluruz.
Yukarıda açıklanan yöntemler, herhangi bir tabandaki herhangi bir sayıyı başka herhangi bir tabana, örneğin 4 tabanından 3tabanına (Örnek 2.6’daki gibi) doğrudan dönüştürmek için kullanılabilir. Bununla birlikte, çoğu durumda, önce 10 tabanına ve sonra istenen tabana dönüştürmek daha hızlı ve daha doğru olabilir. Bu kuralın bir istisnası, bir sonraki bölümde göreceğiniz gibi, ikinin katları olan tabanlar arasında çalışmaktır.
Örnek 2.6
2.2.3. İkinin Katları Arasında Dönüşüm
İkili sayılar, okunabilirliklerini iyileştirmek için genellikle onaltılık ve bazen sekizlik olarak ifade edilir. 16 = 24 olduğu için, 4 bitlik bir grup (hex olarak adlandırılır) onaltılık rakam olarak ifade edilir. Benzer şekilde, 8 = 23 olduğundan, 3 bitlik bir grup (octal olarak adlandırılır) sekizlik rakam olarak ifade edilebilir. Bu ilişkileri kullanarak, bir sayıyı ikiliden sekizliğe veya onaltılıya kolaylıkla dönüştürebiliriz.
Örnek 2.7
sayısını sekizlik ve onaltılık tabana dönüştürelim
2.3. İşaretli Tamsayı Gösterimi
İşaretsiz bir tamsayının bir tabandan diğerine nasıl dönüştürüleceğini gördük. İşaretli sayıların dönüşümünde ilave işlemlerin yapılmasını gerekir. Bir programda bir tamsayı değişkeni bildirildiğinde, birçok programlama dili, depolama yerinin ilk bitini sayının işareti için otomatik olarak ayırır. Geleneksel olarak, en yüksek değerli bitteki “1” rakamı, sayının negatif olduğunu belirtir. Depolama alanı, programlama diline ve bilgisayar sistemine bağlı olarak 8 bitlik bir bayt kadar küçük veya birkaç word (16 bit) kadar büyük olabilir. İşaret bitinden sonraki bitler sayının kendisini temsil etmek için kullanılır.
Bu sayının nasıl temsil edildiği, kullanılan yönteme bağlıdır. Yaygın olarak kullanılan üç yaklaşım vardır. En sezgisel yöntem, işaretli büyüklük, sayının büyüklüğünü temsil etmek için kalan bitleri kullanır. Bu yöntem ve tümleyen kavramını kullanan diğer iki yaklaşım, aşağıdaki bölümlerde tanıtılmaktadır.
2.3.1. İşaretli Büyüklük
Bu noktaya kadar, negatif sayılar için ikili temsil olasılığını göz ardı ettik. Pozitif ve negatif tam sayılar kümesi, işaretli tamsayılar kümesi olarak adlandırılır. İşaretli tam sayıların ikili değerler olarak gösterilmesindeki sorun işaretin kendisidir. Peki sayının işaretini nasıl kodlarız? İşaretli büyüklük gösterimi, bu sorunu çözmenin bir yöntemidir. Adından da anlaşılacağı gibi, işaretli bir büyüklük gösteriminde sayının en soldaki biti (aynı zamanda yüksek dereceli bit – high ordered veya en anlamlı bit – MSB olarak da adlandırılır) işaretini temsil eder, kalan bitler sayısal değerin büyüklüğünü (veya mutlak değerini) temsil eder. Örneğin, 8 bitlik 10000001 = -1 ve 00000001 = +1 dir. İşaretli büyüklük gösterimini kullanan 8 bitlik bir bilgisayar sisteminde, sayının büyüklüğünün temsili için 7 bit kullanılır. Bu, 8 bitlik bir değerin temsil edebileceği en büyük tamsayının 27-1 veya 127 olduğu anlamına gelir (01111111). En küçük tam sayı ise 8 adet 1 (11111111) veya -127’dir. Bu nedenle n bit, -2 (n-1) – 1 ila 2(n-1) – 1’i arasındaki sayıları temsil edebilir.
Bilgisayarlar, bu gösterim kullanılarak temsil edilen tamsayılar üzerinde aritmetik hesaplamalar yapabilmelidir. İşaretli büyüklük aritmetiği, esasen insanların kalem ve kâğıtla kullandıkları aynı yöntemler kullanılarak gerçekleştirilir, ancak çok kolay bir şekilde kafa karıştırıcı olabilir. Örnek olarak, toplama kurallarını düşünün: (1) İşaretler aynıysa, büyüklükleri ekleyin ve sonuç için aynı işareti kullanın; (2) İşaretler farklıysa, hangi sayının mutlak değerce daha büyük olduğunu belirlemelisiniz. Sonucun işareti, mutlak değerce daha büyük sayının işaretiyle aynıdır ve sonuç, büyük olandan küçük olanı çıkararak elde edilir. El ile işaretli aritmetik te kullanılan yöntem budur.
Sayıları işaretlerine göre belirli bir şekilde düzenler, hesaplamayı işaretlere bakmaksızın yapar ve ardından hesaplama tamamlandığında uygun şekilde işareti veririz. Bu fikri 8 bitlik bir word de modellerken, sonucun büyüklüğünü yalnızca 7 bit e sığdırmaya dikkat etmeliyiz.
Örnek 2.8
ile sayılarını işaretli büyüklük aritmetiği ile toplayalım
2.3.2. Tümleyen Sayı Sistemleri
Bir B sayısından A sayısının çıkarılmasını düşünün. Bu, -A’yı B’ye eklemeye eşdeğerdir. Tümleyen sayı sistemi, negatif sayıları temsil etmenin uygun bir yolunu sağlar, böylece çıkarmayı bir toplamaya indirger. Çarpma ve bölme işlemleri tekrarlanan toplama ve çıkarmaya karşılık geldiğinden, negatif sayılar tümleyici formda temsil edildiğinde dört temel aritmetik işlemini yalnızca toplama yaparak gerçekleştirmek mümkündür. İki popüler tümleyici sayı sistemi, taban tümleyici ve azaltılmış taban tümleyicidir.
N sayısının taban tümleyeni aşağıdaki gibi gösterilir;
Burada [N]r tabanın tümleyeni ,
n N sayının tamsayı kısmındaki basamak sayısı.
Bu sistem, hangi sayı sisteminin kullanıldığına bağlı olarak genellikle 2’nin tümleyeni veya 10’un tümleyeni olarak adlandırılır. Bu bölüm 2’lik tümleyen sistemini açıklayacaktır. 10’luk tümleyeni, 2’lik tümleyeni sistemle aynı özellikleri gösterdiğinden, burada tartışılmayacaktır.
Örnek 2.9
(a) (01010)2 sayının 2’lik tümleyeni
25 – (01010) = 100000 – 01010 = 10110
Burada, n = 5 ve r = 2.
(b) (0.0010)2 sayının 2’lik tümleyeni
21 – (0.0010) = 10.0000 – 0.0010 = 1.1110
Burada, n = 1 ve r = 2.
(c) (4887)10 sayısının 10’luk tümleyeni
104 – 4887 = 5113.
Burada, n = 4 ve r = 10.
(d) (48.87)10 sayısının 10’luk tümleyeni
102 – 48.87 = 51.13.
Burada, n = 2 ve r = 10.
Bir diğer yöntem ise aşağıda gösterildiği gibi önce her bit’in tersini alıp daha sonra en düşük değerli bit’e 1 eklemektir.
2.4. Kayan Noktalı Gösterim
Gerçek bir bilgisayar yapmak isteseydik, az önce incelediğimiz tamsayı gösterimlerinden herhangi birini kullanabilirdik. Bunlardan birini seçip ve tasarım aşamasına geçerdik. Bir sonraki adımımız, sistemimizin kelime (word) büyüklüğüne karar vermek olacaktır. Ucuz bir sistemimiz olsun istiyorsak, 16 bit gibi küçük bir kelime boyutu seçerdik. İşaret bitine yer ayırdıktan sonra bu sistemin depolayabileceği en büyük tam sayı değeri 32767’dir. Peki, potansiyel bir müşterimizin isteği olan, belirli bir yıl içinde profesyonel spor etkinliklerine giriş için ödeme yapan izleyici sayısının bir çetelesini tutmak için şimdi ne yapacağız? Elbette sayı 32767’den büyük. Sorun değil. Kelimenin boyutunu büyütebiliriz. Otuz iki bit bu durum da yeterli olacaktır. Kelime boyutumuz artık herhangi birinin saymak istediği herhangi bir şey için yeterince büyük. Peki ya bu müşteri aynı zamanda her bir izleyicinin oyun süresinin dakikası başına harcadığı paranın miktarını bilmesi gerekiyorsa? Bu sayı büyük olasılıkla ondalık bir kesirdi.
Bu soruna en kolay ve en ucuz yaklaşım 16 bitlik sistemimizi korumak ve duruma uygun algoritma geliştirmektir. Bu sorun, bugünün teknolojisi bağlamında büyük bir sorun olmasa da, her bilgisayar neslinin ilk günlerinde gerçekten büyük sorun oluşturmaktaydı. İlk ana bilgisayarların veya mikro bilgisayarların çoğunda kayan nokta birimi diye bir şey yoktu. Uzun yıllar boyunca, akıllı programlama, bu tamsayı sistemlerinin aslında kayan noktalı sistemler gibi davranmasını sağladı.
Bilimsel gösterime aşina iseniz, bir tamsayı sisteminde kayan nokta işlemlerini nasıl yapabileceğinizi – kayan nokta öykünmesini nasıl sağlayabileceğinizi – biliyor olabilirsiniz. Bilimsel gösterimde, sayılar iki parça halinde ifade edilir: mantis adı verilen kesirli bir bölüm ve ihtiyacımız olan değeri elde etmek için gereken on’un kuvveti olan üstel bir bölüm. 32767’yi bilimsel gösterimle ifade etmek için 3.2767 x 104 yazabiliriz. Bilimsel gösterim, çok büyük veya çok küçük sayıları içeren kalem ve kâğıt hesaplamalarını basitleştirir. Aynı zamanda günümüzün dijital bilgisayarlarında kayan nokta hesaplamasının temelidir.
2.4.1. Basit Bir Model
Dijital bilgisayarlarda, kayan noktalı sayılar üç bölümden oluşur: bir işaret biti, üs kısmı (2’nin kuvvetlerini temsil eder) ve anlamlılık ya da mantis olarak adlandırılan kesirli bölüm. Üs ve kesir için kullanılan bit sayısı, aralık veya hassasiyeti optimize etmek isteyip istemediğimize bağlıdır. Aralığı değiştimek istersek üs kısmının, hassasiyeti değiştirmek istersek anlamlılık kısmının bit sayısını değiştirmemiz gerekir. Bu bölümün geri kalanı için, işaret bitli, 5 bitlik üslü ve 8 bitlik anlamlı kısmı olan toplam 14 bitlik bir model kullanacağız (bkz. Şekil 2d). Daha genel formlar Bölüm 2.5.2’de açıklanmaktadır.
Modelimizde on tabanında ki 17 sayısını saklamak istediğimizi düşünelim. olduğunu biliyoruz. Benzer şekilde ikilik sistemde olur. Son formu kullanacak olursak, aşağıda görebileceğiniz üzere kesirli kısım 10001000 ve üs kısmı 00101 (00101 = 5 yani 2’nin kuvveti) olacaktır;
Bu formu kullanarak, 14 bitlik sabit nokta gösteriminde yapabileceğimizden çok daha büyük sayıları depolayabiliriz. sayısını ifade etmek istersek:
Bu modelle ilgili bariz bir sorun, negatif üsler kullanamıyor olmamızdır. 0.25’i saklamak isteseydik, ‘dir ve -2 üssü temsil edilemediğinden bunu yapmamız mümkün olmazdı. Üslere bir işaret biti ekleyerek sorunu çözebilirdik, ancak iki kayan noktalı sayının değerlerini karşılaştırırken daha basit olan ön tanımlı bir üs kullanmanın daha verimli olduğu ortaya çıktı.
Bir ön tanımlı değeri kullanmanın arkasındaki fikir, daha sonra ikili bir sayı olarak depolamak üzere aralıktaki her tamsayıyı negatif olmayan bir tam sayıya dönüştürmektir. İstenilen üs aralığındaki tam sayılar bu ön tanımlı değerin her üsse eklenmesi ile bulunur. Ön tanımlı değer, sıfırı temsil eder ve olası değerler aralığının ortasına en yakın sayıdır. Örneğimizde 16’yı seçebiliriz çünkü 0 ile 31 ‘in ortasındadır (üssümüzün 5 biti vardır, dolayısıyla 32 değere izin verir). Üs alanındaki 16’dan büyük herhangi bir sayı, pozitif bir değeri temsil edecektir. 16’dan küçük değerler negatif değerleri temsil edecektir. Bu gösterime excess-16 denir. Üssün gerçek değerini elde etmek için 16’yı çıkarmamız gerekir.
Örneğimize dönecek olursak, şeklinde hesaplamıştık. Üssümüz artık 16 + 5 = 21 olur:
değerini saklamak istedeydik:
Bu sistemle ilgili hala oldukça büyük bir sorun var: Her sayı için benzersiz bir temsil yoktur. Aşağıdaki sayıların tümü eşdeğerdir:
Buna benzer durumlar dijital bilgisayarlar için pek uygun olmadığından, anlamlı kısmın en solundaki bitin her zaman 1 olması hakkında bir karara varılmıştır. Buna normalizasyon denir. Bu kararın anlamlı kısımda fazladan bir hassasiyet vermesi gibi ek bir avantajı vardır.
Örnek 2.10
Excess-16 yaklaşımı ile 0.0312510 sayısını normalize edilmiş kayan noktalı gösterim formunda gösteriniz
. Ön tanımlı değer uygulandığında üs kısmı 16 – 4 = 12 olur.
Bu örnekte ki 1’in normalleştirme gösterimini ifade etmediğine dikkat edin.
2.4.2. Kayan Nokta Aritmetiği
gibi bilimsel gösterimle ifade edilen onluk tabandaki iki sayıyı toplamak isteseydik, sayılardan birini uygun şekilde değiştirip her ikisini de aynı kuvvette ifade ederdik. Bu durumda örneğimiz, şeklinde toplanabilir. Aşağıda gösterildiği gibi kayan noktalı sayılarda da toplama ve çıkarma işlemleri aynı şekilde yapılır.
Örnek 2.11
Aşağıda ki 14-bit normalizasyon excess-16 ikili tabanda gösterilen sayıları toplayınız.
Üstteki toplanan sayının kuvvetinin iki ve diğer toplananın kuvvetinin sıfır olduğunu görüyoruz. Bu iki sayının ikili tabandaki yazımı şu şekildedir:
Yeniden normalizasyon yaparsak excess-16 gösterimi ile toplam olur. Burada üssü korur ve sığmayan en düşük dereceli biti keseriz. Böylece aşağıdaki gibi yazarız:
Çarpma ve bölme işlemlerinde de olduğu gibi ondalık aritmetikte uygulanan aynı üs kuralları geçerlidir.
Örnek 2.12
Aşağıda verilen sayılara çarpma işlemi uygulayınız.
0.11001000 ile 0.10011010 çarpımı, 1.11011011 sonucunu verir. Uygun üs yazımı ile kayan noktalı çarpım aşağıdaki gibi olur:
2.5. Karakter Kodları
Dijital bilgisayarların sayısal değerleri işlemek için ikili sistemi nasıl kullandığını gördük. Sırada bu değerleri insanlar için anlamlı olan bir biçime nasıl dönüştürebileceğimiz var. Bu dönüşüm, hem bilgisayar tarafından kullanılan kodlama sistemine hem de değerlerin nasıl saklandığına ve çağırıldığına bağlıdır.
2.5.1. İkili Kodlu Onluk (Bınary Coded Decımal – Bcd)
İkili kodlu ondalık (BCD- Binary-Coded Decimal), esas olarak IBM bilgisayar ve sistemlerinde kullanılan sayısal bir kodlama sistemidir. Adından da anlaşılacağı gibi, BCD bir ondalık sayının her basamağını 4 bitlik bir ikili forma kodlar. 8 bitlik bir baytta depolandığında, en yüksek değerlikli 4 bit’e bölge (zone), en düşük değerlikli 4 bit’e ise hane (digit) adı verilir. Bir BCD baytındaki en yüksek değerlikli yarım bayt (4 bit), üç değerden birine sahip olabilen işareti tutmak için kullanılır: İşaretsiz bir sayı 1111 ile gösterilir; pozitif bir sayı 1100 ile belirtilir ve 1101 ile negatif bir sayı gösterilir. BCD numaraları için kodlama Şekil 2.4’de gösterilmektedir.
Şekilde de görebileceğiniz gibi, 1010’dan 1111’e kadar altı olası ikili değer kullanılmamaktadır. Değerlerimizin yaklaşık %40’ı boşa gidecek gibi görünse de, doğruluk konusunda önemli bir avantaj elde edilir. Örneğin, 0.3 sayısı ikili olarak depolandığında devirli bir ondalık sayıdır. 8 bitlik olacak şekilde kırpıldığında 0,296875 olur ve bize yaklaşık %1,05’lik bir hata verir. BCD’de, numara doğrudan 1111 0011 olarak saklanır ve hiçbir hata vermez.
BCD numaralarının haneleri yalnızca yarım bayt kaplar, bu nedenle yerden tasarruf edebilir, bitişik rakamlar bitişik yarım baytlara yerleştirildiğinde hesaplamaları basitleştirebilir ve işaret için bir yarım bayt bırakabiliriz. Bu işlem paketleme olarak bilinir ve bu şekilde depolanan sayılara paketli ondalık sayılar denir.
Örnek 2.13
2468 onluk sayısını BCD formatında gösteriniz.
2.5.2. EBCDIC
IBM System/360’ın geliştirilmesinden önce, karakterleri ve sayıları temsil etmek için 6 bitlik bir BCD varyasyonu kullanmıştı. Bu kod, verileri temsil etme ve işleme konusunda oldukça sınırlıydı; örneğin küçük harflerin temsili kapsam dışında kalıyordu. System/360 tasarımcıları, hem sayıları hem de verileri depolamak için tek tip bir yöntemin yanı sıra daha fazla bilgi işleme yeteneğine ihtiyaç duyuyordu. IBM mühendisleri, önceki bilgisayarlarla ve çevresel ekipmanlarla uyumluluğu sürdürmek için BCD’yi 6 bitten 8 bite genişletmenin en iyisi olduğuna karar verdiler. Buna göre, bu yeni koda Genişletilmiş İkili Kodlu Ondalık Değişim Kodu (EBCDIC – Extended Binary Coded Decimal Interchange Code) adı verildi. IBM, EBCDIC’i IBM ana bilgisayarlarında ve orta ölçekli bilgisayar sistemlerinde kullanmaya devam ediyor. EBCDIC kodu Şekil 2.f’de zone – digit (bölge – hane) biçiminde gösterilmektedir. Karakterler, bölge bitlerine hane bitleri eklenerek temsil edilir. Örneğin, EBCDIC’de a karakteri 1000 0001 ve 3 rakamı 1111 0011’dir. Büyük ve küçük harf karakterleri arasındaki tek farkın soldan 2. bitte olduğuna dikkat edin, bu da büyük harften küçük harfe (veya tam tersi) çevirmenin bir bit’i değiştirmek kadar kolay olmasını sağlar.
2.5.3. ASCII
IBM, Sistem / 360’ı oluşturmakla meşgulken, diğer üreticiler sistemler arasında veri aktarımı için daha iyi yollar bulmaya çalışıyorlardı. Amerikan Bilgi Alışverişi Standart Kodu (ASCII – The American Standard Code for Information Interchange) bu çabaların bir sonucudur. ASCII, onlarca yıldır teletip (teleks) aygıtları tarafından kullanılan kodlama şemalarının doğrudan neslidir. Bu cihazlar, 1880’lerde icat edilen Baudot kodundan türetilen 5 bitlik (Murray) bir kod kullandı. 1960’ların başlarında, 5 bitlik kodların sınırlamaları daha belirgin hale gelmekteydi. Uluslararası Standardizasyon Örgütü (ISO), International Alphabet Number 5 adını verdiği 7 bitlik bir kodlama şeması tasarladı. 1967’de, bu alfabenin bir türevi, şimdi ASCII dediğimiz resmi standart haline geldi.
Şekil 2g’de görebileceğiniz gibi ASCII, 32 kontrol karakteri, 10 basamak, 52 harf (büyük ve küçük harf), 32 özel karakter ($ ve # gibi) ve boşluk karakteri için kodlar tanımlar. Yüksek dereceli (sekizinci) bit, eşlik için kullanılmak üzere tasarlanmıştır.
Eşlik, tüm hata tespit şemalarının en temelidir. Teletipler gibi basit cihazlarda uygulanması kolaydır. Bayttaki diğer bitlerin toplamının çift mi yoksa tek mi olduğuna bağlı olarak bir eşlik biti “açık” veya “kapalı” olur. Örneğin, çift eşlik kullanmak istersek ve bir ASCII A gönderiyorsak, en düşük 7 bit 100 0001’dir. Bitlerin toplamı çift olduğu için, eşlik biti kapalı olacak ve biz 0100 0001 göndereceğiz. Benzer şekilde, bir ASCII C, 100 0011 iletirsek, eşlik biti, biz 8 bitlik bayt 1100 0011’i gönderirken açık olarak ayarlanacaktır. Eşlik, yalnızca tek bitlik hataları algılamak için kullanılabilir.
Telekomünikasyon ekipmanlarıyla uyumluluğa arttırmak için bilgisayar üreticileri ASCII koduna yöneldiler. Bununla birlikte, bilgisayar donanımı daha güvenilir hale geldikçe, eşlik bitine olan ihtiyaç azalmaya başladı. 1980’lerin başında, mikrobilgisayar ve mikrobilgisayar-çevre birimi üreticileri, 12810 ile 25510 arasındaki değerlere “genişletilmiş” bir karakter kümesi sağlamak için eşlik bitini kullanmaya başladı.
Üreticiye bağlı olarak, daha yüksek değerli karakterler, matematiksel sembollerden ñ gibi yabancı dil karakterlerine kadar her şey olabilir. Ne yazık ki, hiçbir akıllıca numara ASCII’yi gerçek anlamda uluslararası bir değişim kodu yapamaz.
2.5.4. UNICODE
Hem EBCDIC hem de ASCII Latin alfabesi üzerine inşa edilmiştir. Bu nedenle, dünya nüfusunun çoğunluğu tarafından kullanılan Latin olmayan alfabeler için veri sunumu sağlama yetenekleri sınırlıdır. Ülkeler bilgisayar kullanmaya başladıkça, her biri kendi ana dillerini en etkili şekilde temsil edecek kodlar tasarladılar. Bunların hiçbiri diğerleriyle uyumlu değildi, bu da yükselen küresel ekonominin önünde başka bir engel oluşturmaktaydı.
İşler daha karmaşık hale gelmeden önce 1991 yılında, endüstri ve kamu liderleri katılımlı bir konsorsiyum tarafından Unicode adında yeni bir uluslararası bilgi alışverişi kodu oluşturuldu. Bu gruba Unicode Konsorsiyumu denir.
Unicode, ASCII ve Latin-1 karakter setiyle uyumlu 16 bitlik bir alfabedir. ISO / IEC 10646-1 uluslararası alfabesi ile uyumludur. Unicode’un temel kodlaması 16 bit olduğundan, dünyanın her dilinde kullanılan karakterlerin çoğunu kodlama kapasitesine sahiptir. Bu yeterli değilse, Unicode ayrıca ek bir milyon karakterin kodlanmasına izin verecek bir uzantı mekanizması tanımlar. Bu, uygarlık tarihindeki her yazı dili için kodlar sağlamak için yeterlidir.
Bölüm Özeti
Bu bölümde dijital bilgisayarlarda veri gösterimi ve sayısal işlemlerin temellerini inceledik. Temel dönüştürme için verilen tekniklerde uzmanlaşmalı ve küçük onaltılık ve ikili sayıları ezberlemelisiniz. Kitabın geri kalanını çalışırken bu bilgi sizin için faydalı olacaktır. Onaltılık kodlama bilginiz, bir sistem çökmesinden sonra bir bellek dökümü okumanız gerekirse veya veri iletişimi alanında ciddi bir çalışma yaparsanız yararınıza olacaktır.
Çoğu bilgisayarın karakterleri göstermek için ASCII veya EBCDIC kullandığını öğrendiniz. Unicode, Java ve Windows’un son sürümleri tarafından kullanılan varsayılan karakter kümesidir. Bilgisayar sistemlerinde karakter gösteriminin temel yöntemi olarak EBCDIC ve ASCII’nin yerini alması muhtemeldir; ancak eski kodlar, hem ekonomileri hem de yaygınlıkları nedeniyle yakın gelecekte bizimle olmaya devam edecek gibi görünüyor.
Kaynakça
Arazi, Benjamin. A Commonsense Approach to the Theory of Error Correcting Codes. Cambridge, MA: The MIT Press, 1988.
Artin, Emil. Galois Theory. New York: Dover Publications, 1998.
Bunt, Lucas N. H., Jones, Phillip S., & Bedient, Jack D. The Historical Roots of Elementary Mathematics. New York: Dover Publications, 1988.
Goldberg, David. “What Every Computer Scientist Should Know About Floating-Point Arithmetic.” ACM Computing Surveys 23:1 March 1991.
Knuth, Donald E. The Art of Computer Programming, 3rd ed. Reading, MA: Addison-Wesley, 1998.
Mee, C. Denis, & Daniel, Eric D. Magnetic Recording, Volume II: Computer Data Storage. New York: McGraw-Hill, 1988.
Pretzel, Oliver. Error-Correcting Codes and Finite Fields. New York: Oxford University Press, 1992.
Schwartz, Eric M., Smith, Ronald M., & Krygowski, Christopher A. “The S/390 G5 Floating-Point Unit Supporting Hex and Binary Architectures.” IEEE Proceedings from the 14th Symposium on Computer Arithmetic. 1999.
Soderquist, Peter, & Leeser, Miriam. “Area and Performance Tradeoffs in Floating-Point Divide and Square-Root Implementations.” ACM Computing Surveys 28:3. September 1996.
The Unicode Consortium. The Unicode Standard, Version 3.0. Reading, MA: Addison-Wesley, 2000.
Warner, Seth. Modern Algebra. New York: Dover Publications, 1990.
Comments