Şimdi sayı sistemlerinin bilgisayarla hesaplamadaki rollerinin ne olduklarına ayrıntılı bir göz atalım.

Benzer belgeler
SAYISAL ELEKTRONİK. Ege Ü. Ege MYO Mekatronik Programı

3.3. İki Tabanlı Sayı Sisteminde Dört İşlem

BLM1011 Bilgisayar Bilimlerine Giriş I

Bir işaretli büyüklük sayısında en soldaki basamak bir işaret içerir. Diğer basamaklarda ise sayısal değerin büyüklüğü (mutlak değeri) gösterilir.

Elektronik sistemlerde dört farklı sayı sistemi kullanılır. Bunlar;

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Sayı sistemleri iki ana gruba ayrılır. 1. Sabit Noktalı Sayı Sistemleri. 2. Kayan Noktalı Sayı Sistemleri

Fatih University- Faculty of Engineering- Electric and Electronic Dept.

Algoritma Geliştirme ve Veri Yapıları 3 Veri Yapıları. Mustafa Kemal Üniversitesi

C#(Sharp) Programlama Dili

Sayılar Teorisi SAYILAR TEORİSİ VE SAYILAR

Sayı sistemleri-hesaplamalar. Sakarya Üniversitesi

Giriş MİKROİŞLEMCİ SİSTEMLERİ. Elektronik Öncesi Kuşak. Bilgisayar Tarihi. Elektronik Kuşak. Elektronik Kuşak. Bilgisayar teknolojisindeki gelişme

HSancak Nesne Tabanlı Programlama I Ders Notları

SAYI VE KODLAMA SİSTEMLERİ. Teknoloji Fakültesi/Bilgisayar Mühendisliği

BMT 101 Algoritma ve Programlama I 6. Hafta. Yük. Müh. Köksal Gündoğdu 1

2. SAYI SİSTEMLERİ VE KODLAR

Programlama Dilleri. C Dili. Programlama Dilleri-ders02/ 1

Nesne Tabanlı Programlama

Nesne Tabanlı Programlama

SAYILAR DOĞAL VE TAM SAYILAR

BLM221 MANTIK DEVRELERİ

Sayı sistemleri iki ana gruba ayrılır. 1. Sabit Noktalı Sayı Sistemleri. 2. Kayan Noktalı Sayı Sistemleri 2. SAYI SĐSTEMLERĐ VE KODLAR

C Dersi Bölüm 1. Bilgisayar Donanımı

1. Bölüm Sayı Sistemleri

Algoritmalar ve Programlama. DERS - 2 Yrd. Doç. Dr. Ahmet SERBES

YZM 2105 Nesneye Yönelik Programlama

Mikrobilgisayarda Aritmetik

BLM-111 PROGRAMLAMA DİLLERİ I. Ders-8 Değişken Tipleri ve Temel Giriş/Çıkış İşlemleri

SAYISAL ELEKTRONİK DERS NOTLARI:

Veri Tipleri Aşağıdaki programdaki 5 hatayı bulunuz.

BILGISAYAR ARITMETIGI

2. Sayı Sistemleri. En küçük bellek birimi sadece 0 ve 1 değerlerini alabilen ikili sayı sisteminde bir basamağa denk gelen Bit tir.

SAYI SİSTEMLERİ. Sayı Sistemleri için Genel Tanım

Bit, Byte ve Integer. BIL-304: Bilgisayar Mimarisi. Dersi veren öğretim üyesi: Yrd. Doç. Dr. Fatih Gökçe

Yrd.Doç.Dr. Celal Murat KANDEMİR. Kodlama (Coding) : Bir nesneler kümesinin bir dizgi (bit dizisi) kümesi ile temsil edilmesidir.

C Programlama Dilininin Basit Yapıları

Atatürk Anadolu. Temel Kavramlar Üzerine Kısa Çalışmalar

10 LU SAYISAL SİSTEMİ İLE 2 Lİ SAYISAL SİSTEMİ ARASINDA ÇEVİRİM UYGULAMASI

Bilgisayar Bilimlerine Giriş 1

Bit, Byte ve Integer. BIL-304: Bilgisayar Mimarisi. Dersi veren öğretim üyesi: Dr. Öğr. Üyesi Fatih Gökçe

Bit, Byte ve Integer. BIL-304: Bilgisayar Mimarisi. Dersi veren öğretim üyesi: Dr. Öğr. Üyesi Fatih Gökçe

BÖLÜM 2 SAYI SĐSTEMLERĐ (NUMBER SYSTEMS)

Bilgisayar Mimarisi. Veri (DATA) Veri nedir? Veri bazı fiziksel niceliklerin ham ifadesidir. Bilgi verinin belli bir yapıdaki şeklidir.

n. basamak basamak 3. basamak 2. basamak 1. basamak Üstel değer 10 n Ağırlık 10 n-1...

T.C. KOCAELİ ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ BİLİŞİM SİSTEMLERİ MÜHENDİSLİĞİ

Konular MİKROİŞLEMCİ SİSTEMLERİ. Giriş. Bilgisayar Tarihi. Elektronik Kuşak. Elektronik Öncesi Kuşak

Sayıtlama Dizgeleri. (a n a n-1 a n1 a n0. b 1 b 2 b m )r. simgesi şu sayıyı temsil eder.

PASCAL PROGRAMLAMA DİLİ YAPISI

Integer Sınıfı. 9.1 Integer Sınıfına Uygulanan Başlıca Metotlar. Ruby de tamsayılar için kullanılan Fixnum ve Bignum sınıflarını üreten sınıftır.

Bit, Byte ve Integer. BIL-304: Bilgisayar Mimarisi. Dersi veren öğretim üyesi: Yrd. Doç. Dr. Fatih Gökçe

TAMSAYILAR. 9www.unkapani.com.tr. Z = {.., -3, -2, -1, 0, 1, 2, 3, } kümesinin her bir elemanına. a, b, c birer tamsayı olmak üzere, Burada,

2. SAYI SİSTEMLERİ. M.İLKUÇAR - imuammer@yahoo.com

2. Sayı Sistemleri. En küçük bellek birimi sadece 0 ve 1 değerlerini alabilen ikili sayı sisteminde bir basamağa denk gelen Bit tir.

TABAN ARĠTMETĠĞĠ. ÇÖZÜM (324) 5 = = = = 89 bulunur. Doğru Seçenek C dir.

VHDL ile KODLAMA ve HATA BULMA TEKNİKLERİ

ÜSLÜ SAYILAR SİBEL BAŞ AKDENİZ ÜNİVERSİTESİ EĞİTİM FAK. İLKÖĞRT. MAT. ÖĞRT. 2. SINIF

Toplama işlemi için bir ikili operatör olan artı işareti aynı zamanda tekli operatör olarak da kullanılabilir.

Buna göre, eşitliği yazılabilir. sayılara rasyonel sayılar denir ve Q ile gösterilir. , -, 2 2 = 1. sayıdır. 2, 3, 5 birer irrasyonel sayıdır.

2.2- DEĞİŞKENLER VE SABİTLER ÇALIŞMA YAPRAĞI

SAYISAL DEVRELER. İTÜ Bilgisayar Mühendisliği Bölümündeki donanım derslerinin bağlantıları

RASYONEL SAYILAR. ÖRNEK: Aşağıda verilen eşitliklerde verilmeyen harflere karşılık gelen tamsayıları bulunuz. RASYONEL SAYILAR A =?

Hatalar ve Bilgisayar Aritmetiği

EGE ÜNİVERSİTESİ EGE MYO MEKATRONİK PROGRAMI

MAK 210 SAYISAL ANALİZ

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

BLM221 MANTIK DEVRELERİ

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI

MATEMATİK. Doç Dr Murat ODUNCUOĞLU

Programlama Dilleri III 1

İÇERİK PROGRAMLAMAYA GİRİŞ ALGORİTMA AKIŞ DİYAGRAMLARI PROGRAMLAMA DİLLERİ JAVA DİLİNİN YAPISI JAVA DA KULLANILAN VERİ TİPLERİ JAVA DA PROGRAM YAZMA

/*int sayi1, sayi2,toplam=0;

Elektroniğe Giriş 1.1

2. ÜNİTE RASYONEL,ÜSLÜ VE KÖKLÜ SAYILAR

Her bir kapının girişine sinyal verilmesi zamanı ile çıkışın alınması zamanı arasında çok kısa da olsa fark bulunmaktadır -> kapı gecikmesi

OCTAL (SEKİZLİ) SAYI SİSTEMİ:

Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : dak.

Programlama Dilleri 3

DERS NOTLARI. Yard. Doç. Dr. Namık AKÇAY İstanbul Üniversitesi Fen Fakültesi

2) Aşağıda verilen işlemleri yazınız. g) ( ) 3) Aşağıda verilen işlemleri yazınız. 4) Aşağıda verilen işlemleri yazınız.

ÜSLÜ SAYILAR. AMAÇ 1: 6 ve 7. Sınıflarda görmüş olduğumuz üslü ifadelerdeki temel kavramları hatırlama

Değişkenler, içerisinde tek bir değer tutabilen yapılardır. Örneğin haftanın günlerini değişkenlerde tutmak istersek, her bir gün adı için bir

Değişkenler. Geçerli değişken isimleri : baslamazamani, ad_soyad, x5 Geçersiz değişken isimleri : 3x, while

Sayı Sistemleri. Onluk, İkilik, Sekizlik ve Onaltılık sistemler Dönüşümler Tümleyen aritmetiği

TAM SAYILARDA ÇARPMA BÖLME İŞLEMLERİ ESRA ÇAKIR

BIL1202 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ (Algoritma Geliştirmek, Satır Kod)

SAYILAR SAYI KÜMELERİ

SAYILAR SAYI KÜMELERİ

Mikroişlemcilerde Aritmetik

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

ALGORİTMA VE PROGRAMLAMA II

Programlama Giriş. 17 Ekim 2015 Cumartesi Yrd. Doç. Dr. Mustafa YANARTAŞ 1

PROGRAMLAMAYA GİRİŞ DERS 2

Sınav tarihi : Süre : 60 dak. a) ABCDE b) BCDE c) ABCD d) kod hatalı e) BCD

İKİLİ SAYILAR VE ARİTMETİK İŞLEMLER

FORMÜLLER VE FONKSİYONLAR

C Konsol Giriş Çıkış Fonksiyonları

ÜNİTE: TAM SAYILAR KONU: Tam Sayılar Kümesinde Çıkarma İşlemi

2. SAYI SİSTEMLERİ 2. SAYI SİSTEMLERİ

Transkript:

237 BÖLÜM 8 Sayı Sistemleri Bölümün İçindekileri Bu bölümde sayıların farklı sayı sistemleri tarafından nasıl temsil edildikleri üzerinde çalışacağız. Sayıların ondalık, ikili ve onaltılık sayı sistemleri tarafından nasıl temsil edildiklerine daha fazla dikkat edeceğiz, çünkü onlar en yaygın olarak bilgisayar ve programlamada kullanılmaktadır. Bilgisayarlarda sayısal verileri işaretli ve işaretsiz tamsayılar ve farklı türde gerçek sayıları kodlamanın farklı yollarını anlatacağız. 8.2 Sayı Sistemleri Şimdi sayı sistemlerinin bilgisayarla hesaplamadaki rollerinin ne olduklarına ayrıntılı bir göz atalım. 8.2.1 Sayı Sistemleri Nedir? Sayı sistemleri rakam olarak adlandırılan sonlu sayıdaki grafiksel işaretler ile sayıları temsil etmenin bir yoludur. Sayıları göstermek için kurallar da bu sisteme eklenmelidir. Belirli bir sayı sisteminde sayıları göstermek için kullanılan karakterler, o sistemin alfabesi olarak adlandırılabilir. İnsan uygarlığının farklı gelişim aşamalarında, çeşitli sayı sistemleri popülerlik kazanmıştır. Bunların en yaygın kullanılanı Arapça rakam sistemidir. 0, 1, 2, 3, 4, 5, 6, 7, 8 ve 9 basamaklarından ve onların alfabesinden oluşmaktadır. (İlginç bir gerçek, Arap rakamlarının modern zamanlarda gösterimi sözü edilen on basamaktan farklı olmasına rağmen aynı ondalık rakam sistemine işaret etmesidir.) Bir alfabenin yanı sıra, her rakam sisteminin bir tabanı vardır. Taban sistem içinde sayıları betimlemede kullanılan farklı basamak sayısıdır. 10 basamak Örneğin, Arapça rakam sistemi 10 basamak kullandığından ondalık olarak adlandırılır. 1 ve 0 dan farklı bir mutlak değere sahip olan rasgele bir sayı baz olarak seçilebilir. Aynı zamanda gerçek veya işareti olan karmaşık bir sayı da olabilir.

238 Şu soruyu pratikte sorabiliriz: Kullanabileceğimiz en iyi rakam sistemi hangisidir? Bunu cevaplamak için, bir sayıyı göstermenin optimal yolunun ne olduğuna (sayıyı oluşturan basamakların sayısı) ve rakam sisteminin kullandığı basamak sayısına tabana karar vermelisiniz. Matematiksel olarak kanıtlanabilir ki, gösterimin uzunluğu ile kullanılan basamak sayısı arasındaki en iyi oran doğal logaritma tabanı olan Euler numarasını (e = 2,718281828) kullanarak gerçekleştirilir. Böylesine bir e tabanlı sistemde çalışmak son derece zahmetli ve kullanışsızdır, çünkü bu sayıyı iki doğal sayının bir oranı olarak ifade edemezsiniz. Bu bize rakam sisteminin optimal tabanının 2 yada 3 olduğu sonucuna götürür. 3 tabanı teknik uygulama için uygun olmadığı için, ikili taban pratikte kullanım için en uygun olan sayı sistemidir ve modern bilgisayarlar ve elektronik cihazlarda kullanılmaktadır. 8.2.2 Konumsal Sayı Sistemleri Konumsal sayı sisteminde basamakların konumları sayı değeri için önemlidir. Sayıdaki basamakların değeri tam anlamıyla tanımlı değildir ve verilen rakamın hangi pozisyonda olduğuna bağlıdır. Örneğin, 351 sayısındaki 1 basamağı ile 1024 sayısındaki 1 basamağı farklı değerlere sahiptir. Önceki sayıda 1 değerine, sonraki sayıda 1000 değerine sahiptir. Sayı sistemlerindeki tabanın sadece konumsal sayı sistemlerinde uygulanabilir olduğunu belirtmeliyiz. Konumsal bir sayı sisteminde A(p) sayısını A(p) = (a(n)a(n-1) a(0),a(-1)a(-2) a(-k)) şu şekilde temsil edilebiliriz: A ( p ) = k m= n a m T m Bu toplamda sayının m.inci basamağı için T m bir ağırlık faktörünü belirtir. Çoğu durumda T m = P m, yani: A ( p ) = k m= n a m P m Yukarıdaki toplam kullanılarak oluşturulan A(p) sayısı sırası ile tamsayı ve ondalık kısımlardan oluşur: (a(n)a(n-1) a(0)) ve (a(-1)a(-2) a(-k)). Bu ifadedeki her a, doğal sayılardan oluşan bir M={0, 1, 2,, p-1} çokluğuna aittir. Konumsal sayı sistemlerinde her basamağın değerinin bir önceki basamaktan sistem tabanının bir katı kadar daha büyük olduğunu kolayca görebilirsiniz (sağa doğru olan basamaktan, yani alt seviyedeki basamak). Bunun doğrudan bir sonucu da şudur: Tabandan daha büyük bir rakamı temsil etmemiz gerekiyorsa

239 bulunduğumuz basamaktan sola bir basamak daha eklememiz gerekmektedir. 2, 8, 10 ve 16 tabanlarındaki sistemler bilgi işlem cihazlarında yaygın halde kullanılmaktadır. Aşağıdaki tabloda 0-15 arasındaki sayıların bu sayı sistemlerindeki gösterimlerini bulacaksınız: İkili Sekizli Onluk Onaltılık 0000 0 0 0 0001 1 1 1 0010 2 2 2 0011 3 3 3 0100 4 4 4 0101 5 5 5 0110 6 6 6 0111 7 7 7 1000 10 8 8 1001 11 9 9 1010 12 10 A 1011 13 11 B 1100 14 12 C 1101 15 13 D 1110 16 14 E 1111 17 15 F

240 8.2.3 Konumsal Olmayan Sayı Sistemleri Konumsal sayı sistemlerinin yanı sıra, konumsal olmayan sayı sistemleri de vardır. burada her basamağın değeri bir sabittir ve sayının içindeki konuma kesin olarak bağlı değildir. Roma ve Yunan sayı sistemleri böyle sayı sistemlerindendir. Konumsal olmayan tüm sayı sistemlerinin ortak bir dezavantajı vardır büyük sayıların temsili çok zordur. Bu sakıncanın bir sonucu olarak, sadece sınırlı kullanım bulmuşlardır. Bu genellikle sayıların değerini belirlerken yanlışlıklara yol açabilir. Roma ve Yunan sayı sistemlerine çok kısa olarak bir bakacağız. 8.2.3.1 Roma Sayı Sistemi Romen rakamıyla sistem sayıları temsil etmek için aşağıdaki sembol dizileri kullanılır: Romen Basamağı Ondalık Değeri I 1 V 5 X 10 L 50 C 100 D 500 M 1000 Daha önce belirtildiği gibi, bu rakam sistemi içinde basamak konumunun sayı değeri için hiçbir önemi yoktur ve sayı değerini belirlemede aşağıdaki kurallar uygulanır: a. Ardışık iki Roma rakamının birinci değeri ikinci değere eşit yada daha büyükse bu iki değer eklenir. Örneğin: III sayısının değeri = 3, ancak MMD sayısının değeri = 2500. b. Ardışık iki Roma rakamının birinci değeri ikinci değerden daha küçükse bu iki değer çıkarılır. Örneğin: IX sayısının değeri = 9, ancak MXL sayısının değeri = 1040 ve MXXIV sayısının değeri = 1024.

241 8.2.3.2 Yunan Sayı Sistemi Yunan sayı sistemi beşli gruplamanın yapıldığı bir ondalık sistemdir. Aşağıdaki basamakları kullanır: Yunan Basamağı Ondalık Değer Ι 1 Γ 5 Δ 10 Η 100 Χ 1,000 Μ 10,000 Tabloda görebileceğiniz gibi, 1 dikey çizgi ile temsil edilmekte, 5, Γ harfi ile, ve 10 un üsleri kendilerine karşılık gelen Yunan sözcüğünün ilk harfi ile temsil edilmektedir. Bu sistemdeki sayılardan bazı örnekler aşağıda verilmiştir: ΓΔ = 50 = 5 x 10 ΓH = 500 = 5 x 100 ΓX = 5000 = 5 x 1,000 ΓM = 50,000 = 5 x 10,000 8.2.4 İkili Sayı Sistemi Bilgisayar Teknolojisinin Temeli İkili sayı sistemini kullanarak modern bilgisayar makinelerinde sayılar temsil edilmekte ve işlenmektedir. Bu sistemin yaygınlığını iki kararlı durum cihazlarını uygulamanın çok kolay olması gerçeği ile ve ikili aritmetik cihazların üretim maliyetinin çok düşük olmasıyla açıklayabiliriz. 0 ve 1 ikili basamakları işlem makinelerinde akım var ve akım yok ile veya +5V ve -5V olarak kolayca temsil edilebilir.

242 Bu avantajlarla birlikte, bilgisayarlarda sayıların gösterimi için ikili sistem kullanmanın sakıncaları da vardır. Pratikte en büyük kusur ikili sayı sisteminde temsil edilen sayıların çok uzun olmaları, yani çok sayıda bit içermeleridir. Bunun doğal sonucu, insanlar tarafından doğrudan kullanım için elverişli olmamasıdır. Bu dezavantajı önlemek için, daha büyük tabanlarda sistemler pratikte kullanılmaktadır. 8.2.5 Ondalık Sayılar Ondalık sayı sisteminde temsil edilen sayılar insanlar tarafından kolay anlaşılacak şekilde doğal bir görünüme sahiptir. Bu sayı sisteminin tabanı 10 dur. Temsil edilen basamaklar 10 sayısının katları olarak sıralanmışlardır. Bir ondalık sayının en düşük seviyedeki basamağı (sağdan sola ilk basamak) bir leri temsil etmek için kullanılır (100 = 1), sonraki basamak on ları temsil eder (101 = 10), sonraki basamak yüz leri temsil eder (102 =100), ve bunun gibi devam eder. Başka bir deyişle izleyen her basamak bir önceki basamaktan 10 kat daha büyük bir değere sahiptir. Farklı basamakların toplamı sayının son değerini belirler. Örnek olarak 95031 sayısını alacağız, ondalık sayı sistemindeki gösterimi aşağıda verilmiştir: 95031 = (9 10 4 ) + (5 10 3 ) + (0 10 2 ) + (3 10 1 ) + (1 10 0 ) Bu şekilde temsil edildiğinde, 95031 sayısı insanlar için doğal bir şekilde anlaşılır, çünkü ondalık sayı sisteminin prensipleri insanlar için temel olarak kabul edilmiştir.! Tartışılan yaklaşımlar, diğer sayı sistemleri için de geçerlidir. Aynı mantık kurgusuna sahiptir, ancak farklı tabanlı bir sisteme uygulanabilir. Örneğin, ayrıntılı olarak biraz sonra tartışacağımız ikili ve onaltılık sayı sistemleri için de geçerlidir. 8.2.6 İkili Sayılar İkili sayı sistemi içinde gösterilen sayılar, ikincil olarak hesap yapan makineler için kolay anlaşılırdır. İnsanlar tarafından biraz daha zor anlaşılır. İkili sayıları temsil etmek için tabanı 2 olan ikili rakam sistemi kullanılır. Bu sayı sisteminde basamaklar 2 nin üsleri olarak konumlandırılmıştır. Gösterimlerinde sadece 0 ve 1 basamakları kullanılır. Genellikle, ondalık olmayan bir sayı sisteminde bir sayı temsil edildiğinde taban sayının yanında parantez içinde bir endeks olarak yazılır. Örneğin 1110(2) gösteriminde ikili sayısal sistemde bir sayı gösterilmiştir. Hiçbir sayı sistemi açıkça belirtilmemişse, sayının ondalık sistemde olduğu kabul edilir. Basamaklar soldan başlayarak sağa doğru okunarak (en yüksek seviyeli basamaktan en düşük seviyeli basamağa doğru) telaffuz edilir.

243 Ondalık sayılarda olduğu gibi, sağdan sola doğru okunan her ikili basamak konumuna uygun şekilde 2 nin bir üssü olarak temsil edilir. İkili sayının en düşük seviyeli basamağı (2 0 =1) konumuna karşılık gelir, ikinci basamağı (2 1 =2) konumuna karşılık gelir, üçüncü basamağı (2 2 =4) konumuna karşılık gelir, ve bunun gibi devam eder. Sayı 8 bit uzunluğunda ise, son bit yedinci üstür (2 7 =128). Sayı 16 bit uzunluğunda ise, son bit onbeşinci kuvvettir. 8 ikili basamak (0 ya da 1) kullanarak 256 sayı temsil edebiliriz, çünkü (2 8 =256). 8 ikili basamak kullanarak 65536 sayı temsil edebiliriz, çünkü (2 16 =65536). İkili rakam sistemindeki sayıların bazı örneklerine bakalım. 148 ondalık sayısını ele alalım. Üç basamaktan oluşur: 1, 4 ve 8 ve aşağıdaki ikili sayı ile temsil edilir: 10010100 (2) 148 = (1 2 7 ) + (1 2 4 ) + (1 2 2 ) Sayının tam gösterimi aşağıdaki tabloda verilmiştir: Sayı 1 0 0 1 0 1 0 0 Üs 2 7 2 6 2 5 2 4 2 3 2 2 2 1 2 0 Değer 1 27 =128 0 2 6 = 0 0 2 5 = 0 1 2 4 = 16 0 2 3 = 0 1 2 2 = 4 0 2 1 = 0 0 2 0 = 0 0 ve 1 lerden oluşan 8 bit uzunluğundaki diziye bir bayt (byte) denir sıradan bir sekiz bitlik ikili sayı. 0 dan başlayarak 255 e kadar olan tüm sayılar bir bayt uzunluğunda temsil edilebilir. Çoğu durumda bu yeterli değildir; sonuç olarak çok sayıda birbirini takip eden baytlar büyük bir sayıyı temsil etmek için kullanılabilir. İki bayt, makine sözcüğü nü (word) oluşturur, (16- bit bilgi işlem makinelerinde) 16 bit uzunluğundadır. Bunun yanı sıra, bilgisayar makineleri 32 bit e karşılık, çift sözcük (double word) ya da dword kullanır.! 0 ile sonlanan bir ikili sayı çifttir. 1 ile sonlanan bir ikili sayı tektir. 8.2.7 İkili Sayı Sisteminden Ondalık Sisteme Dönüştürme İkili sayı sisteminden ondalık sisteme geçerken, ikili sayıdan ondalık sayıya bir dönüşüm yapmak zorundayız. Bir dizi işlem gerçekleştirerek her sayı sisteminden bir sayıyı diğer bir sayı sistemine dönüştürebilirsiniz. Daha önce belirtildiği gibi, ikili sistemde sayılar, 2 nin üsleri olarak konumlandırılan ikili basamaklardan oluşur. 11001(2) sayısını ele alalım. Ondalığa dönüştürme işlemi aşağıdaki toplam hesaplanarak yapılır:

244 11001 (2) = 1 2 4 + 1 2 3 + 0 2 2 + 0 2 1 + 1 2 0 = = 16 (10) + 8 (10) + 1 (10) = 25 (10) Buradan izleyerek 11001 (2) = 25 (10) elde edilir. Diğer bir deyişle her ikili rakam 2 nin bir üssü ile çarpılarak elde edilmiştir. Bu üs basamağın konumunu belirten sayıdır. Sonunda ikili sayının ondalık değerini elde etmek için ikili basamaklarda konumlanan tüm sayıların değerleri toplanır. 8.2.7.1 Horner Şeması Dönüşüm için bir başka yöntem Horner Şeması olarak bilinmektedir. Bunu kullanırken, en soldaki basamak 2 ile çarpılır ve sağdaki basamağa eklenir. Bu sonuç iki ile çarpılır ve sağdaki komşu basamağa eklenir. Sayının tüm basamakları tükenene kadar bu tekrarlanır ve son basamak çarpma olmadan eklenir. Bu yöntemin uygulanmasına bir örnek aşağıda verilmiştir: 1001 (2) = ((1 2 + 0) 2 + 0) 2 + 1 = 2 2 2 + 1 = 9 8.2.8 Ondalık Sistemden İkili Sayı Sistemine Dönüştürme Ondalık sistemden ikili sisteme geçerken, ondalık sayıyı ikili sayıya dönüştürürüz. Bunu gerçekleştirmek için, sayıyı 2 ile böler ve kalanını alırız. Bölüm ve kalanı ayrı ayrı hesaplamalıyız. Örnek sayı olarak tekrar 148 sayısını kullanalım. Dönüştürmeyi istediğimiz taban tarafından bir tamsayı bölmesi gerçekleştirmek durumundayız (bu durumda taban 2). Bölme sonrasında kalanları kullanarak (her zaman ya 0 yada 1 olacaktır) dönüştürlen sayıyı temsil ederiz. 0 katsayısı elde edilene kadar bölünme devam eder. Bir örnek aşağıda verilmiştir: 148:2=74 kalan 0; 74:2=37 kalan 0; 37:2=18 kalan 1; 18:2=9 kalan 0; 9:2=4 kalan 1; 4:2=2 kalan 0; 2:2=1 kalan 0; 1:2=0 kalan 1; Bölüm yapıldıktan sonra, kalanlar ters sırada aşağıdaki gibi temsil edilir: 10010100 yani, 148 (10) = 10010100 (2)

245 8.2.9 İkili Sayılarla İşlemler Toplama, çıkarma ve çarpmanın aritmetik kuralları tek basamaklı ikili sayılar için geçerlidir: 0 + 0 = 0 0-0 = 0 0 0 = 0 1 + 0 = 1 1-0 = 1 1 0 = 0 0 + 1 = 1 1-1 = 0 0 1 = 0 1 + 1 = 10 10-1 = 1 1 1 = 1 Buna ek olarak, ikili sayılarla mantıksal çarpım (conjunction), mantıksal toplam (disjunction) ve modulo iki toplamı gibi (exclusive or) gibi mantıksal işlemleri de yapabilirsiniz. Unutmamanız gerekir ki, toplama ve çıkarma yaparken çok-seviyeli sayılarla aritmetik işlem yaparken farklı seviyeler arasındaki bağlantıyı doğru kurmanız gerekir. Bitsel işlemler ile ilgili bazı detaylara göz atalım: 8.2.9.1 Bitsel and Bitsel AND işleci bir sayıdaki belirli bir bit değerini kontrol etmek için kullanılabilir. Örneğin, belirli bir sayının çift olup olmadığını kontrol etmek istiyorsanız, (en düşük seviyedeki bitin 1 olup olmadığını kontrol ederiz): 10111011 AND 00000001 = 00000001 Sonuç 1 dir ve sayının tek olduğu anlamına gelir (sonuç 0 olsaydı, sayı çift olacaktı). C# dilinde bitsel AND & ile temsil edilir ve kullanımı aşağıda verildiği gibidir: int 8.2.9.2 Bitsel or Bitsel OR işleci, örneğin belirli bir biti 1 e yükseltmek için kullanılabilir. 10111011 OR 00000100 = 10111111 C# dilinde bitsel OR ile temsil edilir ve kullanımı aşağıda verildiği gibidir: int

246 8.2.9.3 Bitsel exclusive or Bitsel XOR işlecinde ikili her basamak ayrı ayrı işlem görür. Bu işlemlerin her biri için ikinci işlenen 0 ise, ilk işlenenin değeri sonuca kopyalanır. İkinci işlenenin 1 olduğu her konumda ise ilk işlenenin karşılık gelen konumunun değeri ters çevrilir ve sonuca bu rakam yazılır. 10111011 XOR 01010101 = 11101110 C# dilinde exclusive or işleci ^ ile gösterilir: int 8.2.9.4 Bitsel negation Bitsel işleç NOT tekli bir işleçtir, yani tek bir işlenene uygulandığı anlamına gelir. Verilen ikili sayının her bitini ters değerine çevirir: NOT 10111011 = 01000100 C# dilinde bitsel negation ~ ile temsil edilir: int 8.2.10 Onaltılık Sayılar Onaltılık sayılar için sistem tabanı olarak 16 kullanılır, 0 dan 15 dahil tüm olası 16 değeri temsil eden basamakların kullanıldığını ifade eder. Zaten önceki bölümlerdeki tablolardan birinde gösterdiğimiz gibi onaltılık sistemde sayıların gösterilmesi için 0-9 basamakları ve A-F Latin karakterleri kullanılır. Bunların her birinin karşılık gelen bir değeri vardır: A=10, B=11, C=12, D=13, E=14, F=15 Onaltılık sayılar için şu örnekler verilebilir: D2, 1F2F1, ve D1E. Ondalık sisteme dönüştürmek için ilk önce en sağdaki basamağı 16 0 ile çarparız, sonra sola doğru sonraki basamağı 16 1 ile çarparız ve daha sonra sola doğru bir sonraki basamağı 16 2 ile çarparız, ve bunun gibi devam eder. Sonunda hepsini toplayarak sonucu buluruz. D1E (16) = E*16 0 + 1*16 1 + D*16 2 = 14*1 + 1*16 + 13*256 = 3358 (10). Onaltılık rakam sistemine dönüştürmek için ondalık sayıyı ard arda 16 ile böleriz ve kalanları tersten alırız. Örnek:

247 Bölüm Kalan 3358 / 16 = 209 14=E(16) 209 / 16 = 13 1=1(16) 13 / 16 = 0 13=D(16) Kalanlar tersten alınınca sayı D1E (16) olur. 8.2.11 İkili Sistemden Onaltılık Sayılara Hızlı Dönüştürme İkili sistemden onaltılık sayılara hızlı dönüştürme hızlı ve kolay şekilde yapılabilir. Bunun için ikili sayı dört bitlik gruplar (yarımşar baytlar) halinde bölünür. Herhangi bir gruptaki basamaklar dörtten azsa, sayının değerini değiştirmeden en soldaki konumlara 0 lar eklenerek dörtlü grup tamamlanır. Bölünme ve sıfırların da, gerekiyorsa eklenmesinden sonra, tüm gruplara karşılık gelen onaltılık basamaklar yan yana dizilir ve sonuç elde edilir. Bir örnek aşağıda verilmiştir: 1110011110 (2) sayısına bir bakalım: I. Yarım baytlara böleriz ve baştaki sıfırları ekleriz. Örnek: 0011 1001 1110. II. Her yarım baytı karşılık gelen onaltılık basamak ile yer değiştiririz ve böylece sonuç olarak 39E (16) elde edilir. Bu nedenle, 1110011110 (2) = 39E (16). 8.2.12 Sayı Sistemleri Özet Özetle, kısa ve net bir şekilde tekrarlayarak formüle edecek olursak, bir konumsal sayı sisteminden diğerine dönüştürmek için kullanılan algoritmalar: Ondalık sayıdan k-tabanlı sayı sistemine dönüştürmek için ondalık sayı ard arda yinelenen bir şekilde k sayısına bölünür ve her bölme işleminden sonra elde edilen kalan not edilir. Yinelenen bölme işlemleri son bulduğunda baştan sona dek elde edilen kalanlar sondan başa olacak şekilde ters sırada yazılarak sonuç olan sayıyı belirler. k-tabanlı sayı sisteminden ondalık sayıya dönüştürmek için en sağdaki basamak k0 ile çarpılır, sağdan sola bir önceki basamak k1 ile çarpılır, bir önceki basamak k2 ile çarpılır, ve bunun gibi devam eder ve çarpımlar toplanır.

248 k-tabanlı sayı sisteminden p-tabanlı sayı sistemine (onaltılık ve ikili sayı sistemleri hariç) dönüştürmek için sayı önce ondalık sisteme dönüştürülür, sonra ondalıktan istenen sayı tabanına çevrilir. İkili ve onaltılık sayı sistemleri arasındaki dönüştürmeler dörtlü bit gruplarının karşılık gelen onaltılık basamağa çevrilmesi ile ve ikili sisteme dönüştürmek için de benzer şekilde her onaltılık basamağın dörtlü-bit grubuna çevrilmesi ile yapılır. 8.3 Sayıların Gösterimi İkili kod bilgisayar makinelerinin işletme belleğinde veri depolamak için kullanılır. Veri türüne bağlı olarak (dizeler, tamsayılar ve ondalık kısmı olan gerçek sayılar) saklamak istediğimiz bilgi özel bir şekilde temsil edilmektedir. Bu veri türüne göre belirlenir. Bir üst düzey dili kullanırken bile bir programcının, makinenin çalışma belleğinde verinin nasıl tahsis edildiğini bilmesi gerekir. Eldeki harici taşıyıcılar üzerinde depolansa da bu durum yine geçerlidir, çünkü veri işlendiğinde, çalışma belleğinde yer alacaktır. Bu bölümde farklı veri türlerini sunmak ve işlemek için başvurulan farklı yollara göz atacağız. Genel olarak bunlar bit, bayt (byte) ve makine sözcüğü (word) kavramlarına dayanmaktadır. Bit 0 veya 1 ikili değerlerinden birine sahip olan bilgi birimidir. Bellekteki bilgiler tek bir bayttan oluşan 8 bitlik diziler halinde toplanır. Bir aritmetik cihaz verilerini işlemek için, belirli bir sayıda bayt (2, 4 veya 8) bellekte yer almalıdır, bu bir makine sözcüğünü oluşturur. Bunlar her programcının bilmesi ve anlaması gerekli kavramlardır. 8.3.1 Tamsayıların Bellekte Gösterimi Şimdiye kadar ele almadığımız konulardan biri de sayıların işaretleridir. Tamsayılar bellekte iki şekilde temsil edilir: işaretli yada işaretsiz. Sayılar işaretli olarak temsil edildiğinde, bir işaret biti tanıtılmalıdır. Bu bit en yüksek seviyedeki bittir, ve negatif sayılar için 1 değerine ve pozitif sayılar için 0 değerine sahiptir. Bitlerin geri kalanı bilgilendiricidir ve sadece sayı değerini temsil ederler (içerirler). İşaretsiz bir sayı olması durumunda, tüm bitler sayı değerini temsil eder.

249 8.3.2 İşaretsiz Tamsayılar İşaretsiz tamsayılar için 1, 2, 4 veya 8 bayt belleğe tahsis edilir. Verilen bir sayının gösterimi için kullanılan bayt sayısına bağlı olarak, değişken boyutlu ve farklı kapsamda gösterimler oluşur. n bayt sayesinde [0, 2n - 1] aralığındaki tüm tamsayılar temsil edilebilir: Sayının bellekte temsili için gerekli bayt sayısı Üslü gösterim Aralık Sayısal gösterim 1 0 2 8-1 0 255 2 0 2 16-1 0 65,535 4 0 2 32-1 0 4,294,967,295 8 0 2 64-1 0 18,446,744,073,709,551,615 Örnek olarak ikili gösterimi 10011110(2) olan 158 sayısının bir tek bayt ve bir çift bayt ile temsil edilişini vereceğiz: 1 bayt ile temsili: 0 0 1 1 1 1 0 2. 2 bayt ile temsili: 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0 8.3.3 Negatif Sayıların Temsili Negatif sayılar için 1, 2, 4 veya 8 bayt bilgisayarın belleğinde tahsis edilir. En yüksek seviyeli (en soldaki bit) bir işaret anlamına sahiptir ve sayı işareti hakkında bilgi taşır. Daha önce belirtildiği gibi, işaret biti 1 değerine sahip olduğunda sayı negatiftir, aksi takdirde sayı pozitiftir. Bir sonraki tablo, bilgisayarda gösterimi için kullanılan bayt sayısına göre işaretli tamsayı değerlerinin aralığını göstermektedir:

250 Sayının Seviye bellekte temsili için gerekli bayt sayısı Üslü gösterim Sayısal gösterim 1-2 7 2 7-1 -128 127 2-2 15 2 15-1 -32,768 32,767 4-2 31 2 31-1 -2,147,483,648 2,147,483,647 8-2 63 2 63-1 -9,223,372,036,854,775,808 9,223,372,036,854,775,807 Negatif sayıları kodlamak için, düz, ters ve ek kod kullanılır. Bu üç gösterimin tümünde işaretli tamsayılar şu aralıktadır: [-2 n-1, 2 n-1-1]. Pozitif sayılar hep aynı şekilde temsil edilmektedir ve düz, ters ve ek kodların hepsi aynı gösterimdir. Düz kod (işaretli büyüklük) sayının en basit temsilidir. En yüksek seviyedeki bit işaret bilgisini taşır ve bitlerin kalanı sayının mutlak değerini tutar. Bazı örnekler aşağıda verilmiştir: İşaretli büyüklüğü 3 olan sekiz bit uzunluğundaki sayı 00000011 olarak temsil edilir. İşaretli büyüklüğü 3 olan sekiz bit uzunluğundaki sayı 10000011 olarak temsil edilir. Ters kod (1 in tümleyeni) sayının işaretli büyüklüğünü oluşturan bitlerin tümünü tersine çevirerek (inversion: Tüm 1 leri 0 ile ve tersi tüm 0 ları 1 ile yer değiştirerek). Bu kod aritmetik işlemlerden toplama ve çıkarma için uygun değildir, çünkü çıkarma gerekli olduğu takdirde farklı bir şekilde yürütülür. Ayrıca işaret bitinin bilgi taşıyan bitlerden ayrı olarak işlenmesi gerekir. Bu dezavantaj ek kod kullanılarak önlenir. Çıkarma işleminin yerine negatif bir sayı ile toplama yapılır. İkinci yöntemde gerekli negatif sayıyı elde etmek için 2 n ile başlayan ve sayının mutlak değerini içeren bir gösterimde toplama işlemi gerçekleştirilir. Örnek: -127 sayısının işaretli büyüklüğü 1 1111111 olarak ve 1 in tümleyeninde 1 0000000 olarak temsil edilir. 3 sayısının işaretli büyüklüğü 0 0000011 olarak ve 1 in tümleyeninde 0 1111100 olarak temsil edilir.

251 Ek kod (2 nin tümleyeni) ters kod temsilindeki sayıya toplama aracılığıyla 1 in eklenmesiyle elde edilen sayıdır. Örnek: -127 sayısının ek kod temsili 1 0000001 dir. Binary Coded Decimal sisteminde, aynı zamanda BCD kodu olarak da bilinir, bir byte içinde iki ondalık basamak kaydedilir. Her bir yarım bayt içinde tek bir ondalık basamak kodlanır. Bu şekilde temsil edilen sayılar bitiştirilebilir, yani bitişik yazım şeklinde ifade edilebilir. Tek bir ondalık basamağı bir bayt içinde temsil edersek, bitiştirilmemiş biçim elde ederiz. Modern işlemciler negatif sayıların temsilinde yukarıda anlattığımız kodlardan birini veya birkaçını kullanırlar, en yaygın kullanılan yöntem 2 nin tümleyenidir. 8.3.4 C# Dilinde Tamsayı Türleri C# dilinde sekiz tamsayı veri türü vardır, işaretli veya işaretsiz. Her bir tür için ayrılan byte miktarına bağlı olarak, farklı değer aralıkları belirlenmiştir. Türlerin açıklamalarını aşağıdaki tabloda bulacaksınız: Tür Boyut Aralık.NET Framework Türü sbyte 8 bit -128 127 System.SByte byte 8 bit 0 255 System.Byte short 16 bit -32,768 32,767 System.Int16 ushort 16 bit 0 65,535 System.UInt16 int 32 bit -2,147,483,648 2,147,483,647 System.Int32 uint 32 bit 0 4,294,967,295 System.UInt32 long 64 bit 9,223,372,036,854,775,808 9,223,372,036,854,775,807 System.Int64 ulong 64 bit 0 18,446,744,073,709,551,615 System.UInt64

252 En çok kullanılanlara kısaca bakacağız. En sık kullanılan tamsayı int türüdür. Bu 2 nin tümleyeni olan bir 32-bit sayı olarak temsil edilir ve [-2 31, 2 31-1] aralığında bir değer alır. Bu tür değişkenler en sık döngüleri çalıştırmak için, endeks dizilerinde ve diğer tamsayı hesaplamalarında kullanılır. int türünde bir değişken örneğinin bildirildiği bir örnek aşağıdaki verilmiştir: int int int Convert 1001 // Converts binary to int long türü C# dilinde tanımlı en büyük işaretli tamsayı türüdür. 64-bit (8-bayt) boyutu vardır. long türü değişkenlerin değerini verirken Latin harfleri l veya L tamsayı değişmezinin sonuna yerleştirilir. Bu pozisyonda yerleştirilen bu değiştiricinin anlamı, değişmezin long türünde bir değer olduğunu belirtmesidir. Bunun yapılmasına neden, varsayılan olarak tüm tamsayı değişmezlerinin int türünde olmasıdır. Bir sonraki örnekte, long türü değişkenleri bildireceğiz ve onlara 64-bit değer vereceğiz: long long Önemli bir durum kullanılan türün temsil edebileceği en büyük sayı aralığını geçmemektir. Bununla birlikte, C# dili bir taşma meydana geldiğinde olacakları kontrol etme olanağını sunmaktadır. Bu checked ve unchecked bloklar aracılığıyla yapılır. Birincisi değişken aralığı aşıldığında bir istisna (System.OverflowException türünde) atmak gerektiğinde kullanılır. Aşağıdaki programlama kodu tam olarak bunu yapmaktadır: checked int int Console Kod fragmanı denetlenmeyen (unchecked) bir blok olsaydı, herhangi bir özel durum olmayacak ve çıkış sonucu yanlış olacaktı:

253 Bu bloklar kullanılmadığı zaman C# derleyicisi varsayılan olarak kontrolsüz modda çalışır. C# dili daha büyük bir aralıktaki pozitif sayı kapsamındaki değişkenler için gerektiğinde yararlı olabilen işaretsiz türleri içerir. Aşağıda işareti olmayan değişkenleri bildiren bazı örnekler verilmiştir. ulong türünün son eklerine (tüm U, L, u, l kombinasyonları) dikkat etmelisiniz. byte uint ulong // or 4139276850u, 4139276850U // or UL, ul, Ul, ul, Lu, lu 8.3.5 Büyük-Endian ve Küçük-Endian Gösterimi Bir bayt uzunluğundan büyük tamsayıların gösteriminde bellekten baytlar iki yolla getirilebilir: Küçük-Endian (Little-Endian: LE): Baytlar en düşük seviyeden en yüksek seviyeye olmak üzere soldan sağa doğru sıralanır. Bu temsil, Intel x86 ve x64 Intel mikroişlemci mimarisinde kullanılmıştır. Büyük-Endian (Big-Endian: BE): Baytlar en yüksek seviyeden başlayarak en düşük seviyeye olmak üzere soldan sağa doğru sıralanır. Bu temsil PowerPC, SPARC ve ARM mikroişlemci mimarisinde kullanılmıştır. A8B6EA72 (16) sayısının her iki bayt sıralamasında gösterimi ile ilgili bir örnek aşağıda verilmiştir: C# dilinde hangi standartta sıralama yapılacağını belirlememize yardımcı bazı sınıflar vardır. Bu İnternet üzerinden bilgi akışı gönderme/alma gibi işlemler için veya farklı standartlara göre yapılan cihazlar arasındaki diğer iletişim türleri için önemlidir. Örneğin BitConverter sınıfının IsLittleEndian alanı hangi modda sınıfın çalışıyor olduğunu ve mevcut bilgisayar mimarisinde verilerin nasıl saklandığını gösterir.

254 8.3.6 Gerçek Kayan Nokta Sayılarının Gösterimi Gerçek sayılar bir tamsayı ve ondalık kısımdan oluşmaktadır. Bilgisayarlarda kayan noktalı sayılar olarak temsil edilmektedir. Aslında bu temsil önde gelen mikroişlemci üreticileri tarafından kabul edilen Kayan Nokta Aritmetik (IEEE 754) Standartı ndan (Standard for Floating-Point Arithmetic) geliyor. Çoğu donanım platformları ve programlama dilleri bu standardın şartlarına göre hesaplama yapılmasına izin verir ve gerektirir. Standart şunu tanımlamaktadır: Aritmetik formatlar: İkili ve ondalık veri formatında sonlu sayıda basamaktan oluşan bir kayan nokta. Değişim formatları: Etkili ve kompakt bir formda veri alışverişi için kullanılabilen kodlama (bit dizileri). Yuvarlama algoritmaları: Hesaplamalar sırasında sayıları yuvarlama için kullanılan yöntemler. İşlemler: Aritmetik ve diğer aritmetik biçimlerdeki işlemler. İstisnalar: Sıfıra gibi bölünme gibi olağanüstü olaylar, taşma ve diğerleri için sinyallerdir. Rasgele bir gerçek sayı R IEEE-754 standardına göre şu şekilde temsil edilir: R = M * q p burada M sayının mantisidir, p üstür, ve q sayının içinde bulunduğu sayı sistemine göre tabanı belirtir. Mantis pozitif veya negatif ortak kesir olmalıdır, M < 1 ve üs - pozitif veya negatif tamsayıdır. Sayıların temsilinde söz edilen yöntemde, her kayan nokta sayısı özetle şu biçime sahip olacaktır: ±0, M*q ± p. Kayan noktalı formatta sayıların gösteriminde, özellikle ikili sayı sistemi kullanıldığında R = M * 2p yazılabilir. Bilgisayar belleğindeki gerçek sayıların bu gösteriminde üssü değiştirdiğinizde, mantisteki ondalık nokta hareket eder ( yüzer ). Kayan-noktalı gösterim biçiminin yarı-logaritmik formu vardır. Açıklaması aşağıdaki şekilde verilmiştir:

255 8.3.6.1 Kayan Nokta Sayılarının Gösterimi Örnek Kayan nokta sayısının bellekte nasıl gösterildiğine bir örnek aşağıda verilmiştir. IEEE-754 standardına göre 32-bit (bir duyarlıkta) kayan nokta formatında bir sayı olan -21,15625 sayısını yazmak istiyoruz. Bu formatta, 23 bit mantis için kullanılır, üs için 8 bit, ve işaret için 1 bit kullanılır. Buna göre sayıyı aşağıdaki gibi gösterebiliriz: Sayı işareti negatiftir, mantisin eksi işareti olduğu anlamına gelir: S = -1 Üssün değeri 4 tür (kayan sırada temsil edildiğinde): p = (2 0 + 2 1 + 2 7 ) 127 = (1+2+128) 127 = 4 Gerçek değere dönüştürmek için 127 çıkarmalıyız, çünkü ek kod temsilinde sıfır konumundan başlayarak 8 bit ile çalışıyoruz, (127 = 2 7-1). Mantisin değeri (işareti dikkate alınmaksızın) aşağıdaki gibi hesaplanır: M = 1 + 2-2 + 2-4 + 2-7 + 2-9 = = 1 + 0,25 + 0,0625 + 0,0078125 + 0,001953125 = = 1,322265625 Dikkat etmelisiniz ki, mantisin ikili gösteriminde eksik olan 1 i de eklemeliyiz. Bunu yaptık çünkü mantis her zaman normalizedir ve varsayılan bir 1 ile başlar. Sayının değeri, aşağıdaki formül kullanılarak hesaplanır, R = M * 2p, bizim örneğimizde aşağıdaki gibidir: R = -1,3222656 * 24 = -1,322265625 * 16 = -21,1562496-21,15625 8.3.6.2 Mantis Normalleştirme Üslü kullanımı daha etkin hale getirmek için mantisin en yüksek seviyedeki biti 1 olmalıdır. Bu şartı yerine getiren her mantis normalizedir. IEEE-754 standardı olarak, mantisin tamsayı kısmının değeri varsayılan olarak 1 dir, bunun anlamı mantis her zaman 1 ile 2 arasında kalan bir sayı olmalıdır.

256 Hesaplamalar sırasında bu şartı yerine getirmez bir sonuç elde edilirse, bu normalleşmenin ihlali anlamına gelir. Sayı daha fazla işleme girmeden öncesinde normalleştirilmelidir, ve bu amaçla mantisdeki ondalık nokta taşınır ve ilgili üs değişikliği yapılır. 8.3.7 C# Dilinde Gerçek Sayı Türleri Float ve Double C# dilinde kayan nokta sayılarını temsil edebilen iki tür vardır: float türü kayan noktalı 32-bit bir gerçek sayıdır ve adı tek duyarlıklı kayan nokta sayısı olarak kabul edilmektedir. double, kayan noktalı 64-bit bir gerçek sayıdır ve adı çift duyarlıklı kayan nokta sayısı olarak kabul edilmektedir. Gerçek veri tipleri ve onlarla ilgili aritmetik işlemler IEEE 754-1985 standardına göre belirtilen şartnameye uygundur. Aşağıdaki tablo, iki türün en önemli özellikleri sunulmuştur: Tür Boyut Aralık Anlamlı Basamak Sayısı.NET Framework Türü float 32 bit ±1,5 10 45 ±3,4 10 38 7 System.Single double 64 bit ±5,0 10 324 ±1,7 10 308 15-16 System.Double float türünde 7 önemli basamak içeren bir mantis vardır, double türü 15-16 anlamlı basamak saklar. Kalan bitler mantis işaretini ve üs değerini belirtmek için kullanılır. double türü daha fazla sayıda anlamlı basamağa sahip olmasının yanı sıra ayrıca daha büyük bir üsse de sahiptir, ki bu da kabul edilebilir değerlerin daha geniş bir kapsama sahip olduğu anlamına gelir. float ve double türlerinde değişken bildiren bir örnek aşağıda verilmiştir: float float Denklemin sağ tarafında görünen sayıların ardına eklenen sonekler, sayının hangi türde ele alınacağını belirterek (f float için, d double için) bu amaca hizmet eder. Bu durumda sonekler

257 yerinde ve uygun kullanılmıştır, çünkü varsayılan olarak 5,0 double sayıdır ve 5 int olarak yorumlanır.! C# dilinde, varsayılan olarak kayan noktalı sayıların değişmezleri double türündendir. Tamsayılar ve kayan noktalı sayıların her ikisi de belirli bir ifadede mevcut olabilir. Bu durumda, tamsayı değişkenleri kayan nokta değişkenine dönüştürülür ve sonuç aşağıdaki kurallara göre tanımlanır: 1. Kayan nokta türlerinin herhangi biri double türünde ise, sonuç double (veya bool) olacaktır. 2. İfadede hiçbir double türü yoksa, sonuç float veya bool olur. Matematiksel işlemlerin çoğu özel bir değere sahip olmayan sonuçlar verebilir, +/- sonsuzluk değeri, veya NaN ( Bir Sayı Değildir anlamına gelen) gibi bu değerler, sayı değildir. Bir örnek aşağıda verilmiştir: double Console Console Console Console Bunu çalıştırmak isterseniz aşağıdaki sonucu alırsınız: Yukarıdaki kodu int yerine double kullanarak çalıştırdığınızda, System.DivideByZeroException istisnası fırlatılır, çünkü bir tamsayının 0 ile bölünmesi izin verilen bir işlem değildir.

258 8.3.8 Kayan Noktalı Sayıları Kullanırken Karşılaşılan Hatalar IEEE 754 standardına göre sunulan kayan noktalı sayılar (birkaç yüz basamaklı) çok büyük sayıların ve aynı zamanda sıfıra çok yakın (ilk anlamlı basamak öncesinde noktadan sonraki yüzlerce basamağın var olduğu) sayıların kullanıldığı fizik hesaplamaları için çok uygundur. Bu sayılarla çalışırken, IEEE 754 formatı son derece uygundur, çünkü üs içinde sayının kuvvetini tutar, ve mantis sadece anlamlı basamakları saklamak için kullanılır. 15-16 basamaklı kesinlikteki 64-bit kayan noktalı sayılar için ondalık noktanın sola ve sağa 300 konum hareket etmesi (taşınması) mümkündür. Ne yazık ki her gerçek sayının IEEE 754 formatında tam bir temsili yoktur, çünkü her sayı 2 nin negatif üslerini içeren ve sınırlı sayıdaki terimlerinden oluşan birer polinom olarak yazılamaz. Bu günlük basit finansal hesaplamalar için kullanılan sayılar için de aynen geçerlidir. Örneğin 0,1 sayısının temsilinde 32-bit kayan nokta değeri 0,099999994 olarak sunulmuştur. Uygun yuvarlama kullanılırsa, sayı 0,1 olarak kabul edilebilir, ancak hata birikmiş ve ciddi sapmalara neden olabilir, özellikle finansal hesaplamalar için. Örneğin her birinin birim fiyatı 0,1 EUR olan 1000 elemanı toplarken 100 EUR bir miktar almalısınız, ancak hesaplamalar için 32-bit kayan noktalı sayıları kullanırsanız sonuç 99,99905 olacaktır. İkili rakam sisteminde ondalık gerçek sayıların yanlış sunumundan kaynaklanan hataları kanıtlayan bir örnek C# dili için aşağıda verilmiştir: float int Console Sum = {0} // Sum = 99.99905 Bu örneği çalıştırdığınızda veya daha çarpıcı hataları almak için değiştirirseniz kolayca hesaplama hatalarını görebilirsiniz. 8.3.9 Kayan Noktalı Sayıların Duyarlıkları Kayan noktalı sayılar ile ilgili hesaplamaların sonuçları ve doğruluğu aşağıdaki parametrelere bağlıdır: 1. Sayı gösteriminin kesinliği 2. Kullanılan sayı yöntemlerinin kesinliği

259 3. Yuvarlamalardan vb kaynaklanan hataların değeri Kayan noktalı sayılar ile yapılan hesaplamalar yanlış olabilir, çünkü bunlar ancak belirli bir duyarlığa kadar bellekte temsil edilirler. Bir örnek olarak aşağıdaki kod parçasına bakalım: for Console Console {0:r} Döngü içinde yürütülmesi sırasında sum değişkenine 1/10 değeri eklenir. WriteLine() yöntemi çağrıldığında, değişkenin (yuvarlatılmamış) değerini yazdırmak için gidiş-dönüş biçimi belirteci kullanılır : {0:r} ve bundan sonra bir format belirtmeden aynı değeri yazdırıyoruz. Programı çalıştırdığınızda sonuç olarak 1,0 döndürmesi beklenir, ancak gerçekte yuvarlama kapatıldığında, Program doğruya yakın ancak yine de farklı bir değer döndürür: Örnekten de görülebileceği gibi,.net Framework te kayan noktalı sayılar yazdırılırken IEEE 754 formatında rastlanılan yanlış gösterim hataları azaltması amacıyla varsayılan olarak yuvarlatılmaktadır. Yukarıdaki hesaplama sonucu açıkçası yanlıştır, ancak yuvarlama sonrasında doğru görünmektedir. Ancak, 0,1 birkaç bin kere eklerseniz, hata birikir ve yuvarlama ile bunu telafi etmek mümkün olmayacaktır. Örnekteki yanlış cevabın nedeni 0,1 sayısının double türünde kesin bir temsilinin olmaması ve yuvarlatılmasıdır. float türünü double ile yer değiştirelim: float for Console {0:r}

260 Yukarıda kod çalıştırıldığında, tamamen farklı bir sonuç toplamı döndürülür: Yine hata yuvarlamadan kaynaklanmaktadır. Programın bu sonuçları neden verdiğini araştırmak için, float türündeki 0,1 sayısının gösterimine aşağıdaki şekildeki gibi bakmalıyız: Tüm bunlar, mantis dışında, doğru görünüyor, mantis 1,6 dan biraz daha büyük bir değere sahiptir, tam kesinlikte 1,6 ya değil; çünkü bu sayı 2 nin negatif kuvvetlerinin bir toplamı olarak sunulamaz. Çok kesinlikte olmak zorundaysak, mantis değeri 1 + 1 / 2 + 1 / 16 + 1 / 32 + 1 / 256 + 1 / 512 + 1 / 4096 + 1 / 8192 + 1 / 65536 + 1 / 131072 + 1 / 1048576 + 1 / 2097152 + 1 / 8388608 1,60000002384185791015625 1,6. Yani 0,1 sayısı için IEE 754 tarafından getirilen öneri 1,6 2-4 sayısından biraz daha fazladır ve 0,1 float türü olarak kaydedildiğinde hata toplama sırasında değil ancak toplamadan önce oluşur. Double ve Float türlerinin, Epsilon adında bir alanı vardır. Sıfırdan büyük olan en küçük değeri içeren bir sabittir, System.Single veya System.Double örneği ile temsil edilebilir. Epsilon dan daha küçük her değerin 0 a eşit olduğu kabul edilir. Örneğin, birbirinden farklı olan iki sayıyı karşılaştırırsak, ancak farkları Epsilon dan küçükse, bunlar eşit kabul edilecektir. 8.3.10 Decimal Tür.NET Framework ün System.Decimal türü büyük sayılar ve hassas finansal hesaplamalar için çok uygundur ve 128-bit kesinliğinde ondalık kayan nokta aritmetiğini kullanır. decimal türün bazı karakteristik özellikleri aşağıda verilmiştir:

261 Tür Boyut Aralık Anlamlı basamak sayısı.net Framework Türü decimal 128 bit ±1.0 10 28 ±7.9 10 28 28-29 System.Decimal Kayan noktalı sayıların aksine, decimal türü için geçerli aralıktaki tüm ondalık sayıların duyarlığı korunur. Ondalık sayılarla çalışırken elde edilen bu mükemmel duyarlık, mantisin iç gösteriminin ikili sistemde değil, ondalık sistemde olmasından dolayıdır. Üs ayrıca 10 un kuvveti değil, 2 nin kuvvetidir. Böylece sayılar ikili sayı sisteme dönüştürülmeksizin tam kesinlikte temsil edilir. float ve double türleri ve üzerlerinde gerçekleştirilen işlemler tüm modern bilgisayar mikroişlemcilerinin parçası olan aritmetik işlemci tarafından gerçekleştirildiği için, ve decimal türü.net CLR yazılımı tarafından uygulandığı için double ile karşılaştırıldığında decimal onlarca kat daha yavaş çalışır, ancak finansal hesaplamaların yürütülmesi için yeri doldurulamaz. Hedefiniz decimal türünde değişkene belirli bir değişmezi atamak ise, sonek olarak m veya M kullanmanız gerekir. Örneğin: decimal decimal Önceki örnekte float / double yerine decimal kullanalım: decimal for Console Bu kez sonuç tam olarak beklediğimiz gibidir:

262 decimal türü kayan nokta türlerine göre daha yüksek bir duyarlığa sahip olsa da, daha küçük bir değer aralığına sahiptir ve, örneğin, 1e-50 değerini göstermek için kullanılamaz. Sonuç olarak, kayan noktalı sayılar decimal a dönüştürülürken bir taşma oluşabilir. 8.3.11 Karakter Verileri (Dizeler) Hesaplamada karakter (metin) verisi bir bayt dizisi kullanılarak kodlanan metindir. Metin verilerini kodlamak için kullanılan farklı kodlama şemaları vardır. Çoğu bir bayt veya birkaç bayt sırası içinde tek karakteri kodlar. Böyle kodlanan şemalar arasında ASCII, Windows 1251, UTF-8 ve UTF-16 bulunmaktadır. 8.3.11.1 Kodlama Şemaları (Kodlamalar) ASCII kodlama şeması Latin alfabesinin benzersiz harflerini diğer sembolleri ve özel karakterler ile karşılaştırır ve tek bir bayt halinde yazar. ASCII standardı 127 toplam karakteri içerir, bunların her biri bir bayt halinde yazılmıştır. ASCII standardına göre bir bayt dizisi olarak yazılmış bir metin, Arap, Korece ve Çince olanlar gibi diğer alfabeleri veya Kiril karakterlerini içeremez. ASCII standardında olduğu gibi, Windows 1251 kodlama şeması da Latin alfabesindeki harfleri, Kril ve diğer sembolleri ve özel karakterleri karşılaştırır ve bir byte halinde yazar. Windows 1251 kodlaması 256 adet karakter tanımlar bir bayt içine yazılabilecek en fazla sayıda değer. Windows 1251 standardına göre yazılmış bir metin, sadece Kiril ve Latin harflerini içerebilir, Arapça, Hintçe yada Çince desteklenmez. UTF-8 kodlaması tamamen farklıdır. Unicode standartındaki tüm karakterler dünyadaki tüm yaygın dillerde kullanılan harfler ve semboller (Kiril, Latin, Arap, Çin, Japon, Kore ve diğer birçok dil ve yazı sistemleri) bu standart içinde kodlanabilir. UTF-8 kodlama yarım milyondan fazla sembol içermektedir. UTF-8 kodlamasında daha sık kullanılan semboller (örneğin Latin harfleri ve basamaklar) 1 bayt ile kodlanmıştır, ikinci en sık kullanılan semboller 2 bayt ile kodlanmıştır (örneğin Kiril harfleri), ve daha nadiren kullanılanlar 3 veya 4 bayt ile kodlanmıştır (Çin, Japon ve Kore alfabesinde olduğu gibi). UTF-16 kodlaması, UTF-8 de yaygın olarak kullanılan tüm diller ve yazı sistemlerindeki metinleri Unicode standartında tasvir edebilir. UTF-16 da her sembol 16-bit ile yazılır (2 bayt) ve daha nadiren kullanılan semboller iki 16-bit değer dizisi olarak sunulmaktadır.

263 8.3.11.2 Bir Dizi Karakterin Sunulması Karakter dizileri çeşitli şekillerde temsil edilebilir. Bellekte metin yazmak için en yaygın yöntem 2 yada 4 bayt içinde önce dizenin uzunluğunu, bunun ardından metnin kendisinin bir çeşit kodlama ile kodlanmış bayt dizisini yazdırmaktır (Örneğin Windows-1251 veya UTF-8 için). Bellekte metin yazdırmak için C dili için tipik ve daha az başvurulan bir başka yaygın yöntem de, metinleri genellikle 1 byte içinde karakter dizisi olarak kodlar, özel bir bitiş karakteri tarafından, çoğunlukla bu 0 dır, takip edilir. Bu yöntemi kullanırken, bellek içinde belirli bir konumda bulunan kaydedilmiş metin uzunluğu önceden belirli değildir. Bu, birçok durumda bir dezavantaj olarak kabul edilmektedir. 8.3.11.3 Char Türü C# dilinde char türü tek bir Unicode karakterin tamamının veya bir kısmının kodlandığı 16-bitlik değere sahiptir. Tüm Avrupa dilleri tarafından kullanılan çoğu alfabede bir harf, tek bir 16-bitlik değer ile yazılır ve bu nedenle char türünde bir değişkenin tek bir karakteri temsil ettiği kabul edilir. Bir örnek aşağıda verilmiştir: char A 8.3.11.4 String Türü C# dilinde string türü UTF-16 kodlu metinleri saklamada kullanılır. Tek bir C# dizesi 4 baytlık uzunluk, ve char türünün 16-bit değerleri olarak yazılan bir char dizisini belirtir. string türü ile tüm yaygın alfabelerde ve insanların yazdığı her türlü yazı sistemi ile yazılmış metinleri saklayabilirsiniz - Latin, Kiril, Çince, Japonca, Arap ve birçok diğerleri. string kullanımına bir örnek aşağıda verilmiştir: Example

264 Alıştırmalar 1. 151, 35, 43, 251, 1023 ve 1024 sayılarını ikili sayı sistemine dönüştürün. 2. 1111010110011110(2) sayısını onaltılık ve ondalık sayı sistemlerine dönüştürün. 3. Onaltılık sistemdeki FA, 2A3E, FFFF, 5A0E9 sayılarını ikili ve ondalık sayı stemlerine dönüştürün. 4. Ondalık sayı sistemindeki bir sayıyı ikili sayıya dönüştüren bir program yazın. 5. İkili sayı sistemindeki bir sayıyı ondalık sayıya dönüştüren bir program yazın. 6. Ondalık sayı sistemindeki bir sayıyı onaltılık sayıya dönüştüren bir program yazın. 7. Onaltılık sayı sistemindeki bir sayıyı ondalık sayıya dönüştüren bir program yazın. 8. Onaltılık sayı sistemindeki bir sayıyı ikili sayıya dönüştüren bir program yazın. 9. İkili sayı sistemindeki bir sayıyı onaltılık sayıya dönüştüren bir program yazın. 10. İkili sayı sistemindeki bir sayıyı onaltılık sayıya Horner şemasını kullanarak dönüştüren bir program yazın. 11. Romen basamaklarına karşılık gelen Arap basamaklarını yazdıran bir program yazın. 12. Arap basamaklarına karşılık gelen Romen basamaklarını yazdıran bir program yazın. 13. Verilen bir N, S, D için (2 S, D 16) N sayısını S tabanlı sayı sisteminden D tabanlı sayı sistemine dönüştüren bir program yazın. 14. 50.000.000 kere 0,000001 sayısını ard arda toplamayı deneyin. Bir döngü içinde toplama kullanın (doğrudan çarpma kullanmayın). float ve double türleri için ve bundan sonra decimal ile deneyin. Hesaplama hızı ve sonuçlardaki farkı açıklayınız. 15. * float türündeki sayılar (IEEE 754 standardına göre kayan noktalı 32-bitlik sayılar) için mantis değeri, mantis işareti ve üssünü yazdıran bir program yazın. Örnek: -27,25 sayısı için işaret biti = 1, üs = 10000011, mantis = 10110100000000000000000 olarak yazılmalıdır.