Bilgisayarım birşeyleri bellekte nasıl saklar?

Muhtemelen, bilgisayarınızdaki herşeyin sıralı bitler (ikili sayılar; bunları bir sürü ufak açma-kapama anahtarı olarak düşünebilirsiniz) olarak saklandığını biliyorsunuzdur. Burada, bu bitlerin bilgisayarınızın tek tek hesapladığı harfleri ve sayıları temsil etmede nasıl kullanıldıklarından bahsedeceğiz.

Buraya girmeden önce, bilgisayarınızın kelime uzunluğu hakkında bilgi sahibi olmanız gerekmektedir. Kelime uzunluğu, bilgisayarınızdaki bilgi ünitelerini taşımak için tercih ettiği boyuttur. Teknik olarak, işlemcinizin aritmetik ve mantıksal hesaplamalarında kullanmak için tuttuğu alanlar olan yazmaçların genişliğidir. İnsanların, bilgisayarınızın bit boyutu("32-bit" veya "64-bit" olarak çağırırlar) hakkında yazdığında, kastettikleri şey budur.

Çoğu bilgisayarlar (386,486 ve Pentium PC'ler dahil), 32 bitlik bir kelime uzunluğuna sahiptir. Eski 286 makineleri 16 bitlik bir kelime uzunluğuna sahipti. Eski model anabilgisayarlar çoğu kez 36 bitlik kelimelere sahipti. Eski DEC olan, AMD Opteron, Intel Itanium ve Alpha ve şimdiki Compaq 64 bitlik kelimelere sahiptir.

Bilgisayarınız belleğinizi, bellek boyutuna bağlı olarak, sıfırdan çok büyük değerlere kadar numaralandırılmış kelime dizisi olarak görür. Bu değer, 286 gibi daha eski makinelerdeki programların, belleğinizin geniş miktarını adreslemek için açıklı eğilimlerde bulunmak zorunda kaldığı kelime uzunluğunuz tarafından limitlenmiştir. Onları burda anlatmayacağım; onlar hala eski programacıların kabusu oluyorlar.

Sayılar

Integer sayılar, işlemcinizin kelime uzunluğuna bağlı olarak, kelimeler ya da kelime çiflerinden birisi olarak temsil edilirler. Bir 32 bitlik makine kelimesi, en genel integer temsilidir.

Integer aritmetiği, ikili tabandaki matematiğe tam olarak olmasa da yakındır. Düşük değerli bir 1, sonraki 2, daha sonra 4 ve böylece bundan sonrası saf ikilidir. Ancak negatif işaretli sayılar ikiye tümleyen gösteriminde temsil edilirler. Yüksek değerli bit, niceliği negatif yapan işaret bitidir ve her negatif sayı, tüm bitlerin ters çevrilerek ve bir eklenerek elde edilen uygun olan pozitif değerden elde edilebilir. Bu nedenle, 32 bitlik bir makinedeki integerların -2^31 den 2^31-1'e kadar bir alanı vardır. Bu 32. bit işaret için kullanılıyor; 0, pozitif bir sayı veya sıfır, 1 ise negatif bir sayı anlamına gelir.

Kimi bilgisayar dilleri, yalnızca sıfır ve pozitif sayılardan oluşan basit işaretsiz 2'li taban aritmetiğini kullanmanıza izin verir.

Çoğu işlemciler ve bazı diller, işlemleri kayan noktalı sayılarla (bu yetenek tüm günümüz işlemci çiplerine inşa edilmiştir) işlem yapabilir. Kayan noktalı sayılar, integerlardan çok daha geniş bir değer aralığını size sunar ve parçaları ifade etmenize izin verir. Bunun yapılma şekli çeşitlidir ve burada ayrıntılı olarak bahsetmek için oldukça fazla karmaşıktır. Fakat ana fikir "bilimsel notasyon" debilen şey gibidir. Bu notasyonda 1.234*10^23 yazılabilir; bu da rakamın iki parçada, logaritmanın ondalık kısmı (1.234, mantissa) ve üslü kısım (23) olarak onun üssü şeklinde gösterilmesidir. (Bu da çarpımın 20 sıfırlı olacağı anlamına gelir, 23 üç ondalık kısmı çıkarır)

Karakterler

Normalde karakterler, herbiri ASCII(American Standard Code for Information Interchange) kodu olan, yedi bitle temsil edilir. Modern makinelerde, her 128 ASCII karakteri bir oktetin veya 8 bitlik bayt'ın düşük yedi bitidir. Oktetler bellek kelimeleri olarak paketlenmiştir. Böylece (örneğin) altı karakterli bir string, iki bellek kelimesi kadar yer kaplar. Bir ASCII kod tablosu için, Unix isteminizde 'man 7 ascii' yazınız.

Önceki paragraf iki yolda yanıltıcıdır. Önemsiz olanı, 'octet' terimi formal olarak doğrudur, ancak gerçekten nadiren kullanılır. Çoğu insan octetten bayt olarak bahseder ve baytları da sekiz bit uzunluğunda farzeder. Tam olarak bayt terimi daha geneldir. Örneğin; 9 bitlik baytlardan oluşan 36 bitlik makineler (Gerçi bu durum muhtemelen bir daha asla olmayacak) kullanılmıştır.

Daha önemli bir şey ise, dünyanın tamamının ASCII kullanmıyor olmasıdır. Aslında, dünyanın çoğu kullanamaz. ASCII, Amerikan İngilizcesi için uygun iken, aksan eksiklikleri ortaya çıkmış ve diğer dillerin kullanıcıları özel karakterlere ihtiyaç duymuşlardır. Hatta Britanya İngilizcesinin pound para biriminin işaretinin eksikliği ile başı beladadır.

Bu problemi çözmek için birtakım denemeler vardır. Bunların tümü, ASCII'de olmayan, onu 256'lık karakter kümesinin düşük yarısı yapan, ekstra olarak yüksek bit kullanır. Bunlar için en yaygın olarak kullanılan, 'Latin-1' karakter kümesidir (daha resmi çağırımı ISO 8859-1). Bu karakter kümesi, Linux, daha eski HTML versiyonları ve X için öntanımlı karakter kümesidir. Microsoft Windows, tarihsel nedenlerden dolayı Latin-1'in atanmamış olarak bıraktığı (bu sıkıntının sebep olduğu incitici hesabı için demoronizer sayfasını ziyaret ediniz) uygun olan yerlere sağ ve sol çift tırnak gibi, Latin-1'e bir demet karakter ekleyen değiştirilmiş bir versiyonunu kullanır.

Latin-1, İngilizce, Fransızca, Almanca, İspanyolca, İtalyanca, Hollandaca, Norveççe, İsveççe, Danimarkaca ve İzlandacayı içeren batı Avrupa dillerini kullanır. Ancak, ikisi de yeterince iyi değildir ve sonuç olarak, Yunanca, Arapça, İbranice, Esperanto ve Sırp-Hırvat dili gibi dilleri kullanmak için, 9 karakter kümesi içerisinden Latin-2 serisinin bir bütünüdür. Detaylar için, ISO soup alfabesi sayfasını ziyaret ediniz.

Nihai çözüm, Unicode (ve onun tek yumurta ikizi ISO/IEC 10646-1:1993) denilen muazzam bir standarttır. Unicode Latin-1'e, içindeki en düşük 256 yuvası ile özdeştir. Yukarıdaki bu 16 bitlik uzay, Yunanca, Kirilce, Ermenice, İbranice, Arapça, Devanagari, Bengal, Gurmukhi, Gujarati, Oriya, Tamil, Telugu, Kannada, Malayalam, Tayca, Laoca, Gürcüce, Tibetçe, Kana Japoncası dillerini, Hangul Korecesinin tümünü ve Çince/Japonca/Korece (CJK) ideogramının bir birleşimini içerir. Detaylar için, Unicode Anasayfasını ziyaret ediniz.