C++ | VERİ TÜRLERİ
Nesne (Object) kavramını incelediğimiz zaman, nesnelerin en önemli özelliklerinden birinin nesnenin türü olduğunu belirtmiştik. Tür (type) nesnenin olmazsa olmaz bir özelliğidir ve türü olmayan bir nesneden söz etmek mümkün değildir. Derleyiciler nesnelerle ve verilerle ilgili kod üretirken, tür bilgisinden faydalanırlar. Tür bilgisinden, söz konusu veriyi bellekte ne şekilde tutacaklarını, verinin değerini ne şekilde yorumlayacaklarını, veriyi hangi işlemlere tabi tutabileceklerini öğrenirler.
Programlama dilleri açısından baktığımız zaman türleri iki ayrı gruba ayırabiliriz.
1. Önceden tanımlanmış veri türleri (Doğal veri türleri)
(Basic tpes, default types, built-in types, primitive types)
Programlama dilinin tasarımından kaynaklanan ve dilin kurallarına göre varlığı garanti altına alınmış olan türlerdir. Her programlama dili programcının doğrudan kullanabileceği, çeşitli özelliklere sahip veri türleri tanımlar. C dilinde de önceden tanımlanmış 11 adet veri türü vardır.
2. Programcının tanımlanmış olduğu veri türleri (user defined types)
Programlama dillerinin çoğu, önceden tanımlanmış veri türlerine ek olarak, programcının da yeni türler tanımlanmasına izin vermektedir. Programcının tanımlayacağı bir nesne için önceden tanımlanmış veri türleri yetersiz kalıyorsa, programcı kendi veri türünü yaratabilir. C dilinde de programcı yeni bir veri türünü derleyiciye tanıtabilir ve tanıttığı veri türünden nesneler tanımlayabilir.
Farklı programlama dillerindeki önceden tanımlanan veri türleri birbirlerinden farklı olabilir. Daha önce öğrenmiş olduğunuz bir programlama dilindeki türlerin aynısını C dilinde bulamayabilirsiniz.
C dilininin önceden tanımlanmış 11 veri türü vardır. Bu veri türlerinden 8 tanesi tamsayı türünden verileri tutmak için, kalan 3 tanesi ise gerçek sayı türünden verileri tutmak için tasarlanmıştır. Biz bu türlere sırasıyla “Tamsayı veri türleri” (integer types) ve “gerçek sayı veri türleri” (floating types) diyeceğiz.
Tamsayı veri türleri (integer types)
C dilinin toplam 4 ayrı tamsayı veri türü vardır ancak her birinin kendi içinde işaretli ve işaretsiz biçimi olduğundan, toplam tamsayı türü 8 kabul edilir.
İşaretli (signed) tamsayı türlerinde pozitif ve negatif tam sayı değerleri tutulabilirken, işaretsiz (unsigned) veri türlerinde negatif tamsayı değerleri tutulamaz.
Bu türleri sırasıyla inceleyelim:
işaretli ve işaretsiz char veri türü :
Şüphesiz char sözcüğü ingilizce character sözcüğünden kısaltılmıştır ve türkçe “karakter” anlamına gelmektedir. Ancak bu türün ismini, bundan sonraki derste C dilinin bir anahtar sözcüğü olduğunu öğreneceğimiz char sözcüğü ile özdeşleştirip, “char türü” (çar diye okuyunuz) diye söyleyeceğiz. İşaretli char türünden bir nesnenin bir byte’lık bir alanda tutulması C standartlarınca garanti altına alınmıştır.
1 byte’lık bir alanı işaretli olarak kullandığımızda yazabileceğimiz değerlerin -128 / 127 değerleri arasında değişebileceğini sayı sistemleri dersimizden hatırlayalım.
işaretsiz char veri türünün işaretli olandan farkı 1 byte’lık alanın işaretsiz olarak, yani yalnızca 0 ve pozitif sayıların ifadesi için kullanılmasıdır. Bu durumda işaretsiz char türünde 0 – 255 arasındaki tamsayı değerleri tutulabilir.
işaretli ve işaretsiz short int veri türü (işaretli kısa tamsayı türü – işaretsiz kısa tamsayı türü) :
Yine bundan sonraki derste öğreneceğimiz gibi, short ve int sözcükleri C dilinin anahtar sözcüklerinden olduğu için bu türün ismini genellikle short int, ya da kısaca short türü olarak telaffuz edeceğiz.
işaretli ve işaretsiz short veri türünden bir nesne tanımlandığı zaman, nesnenin bellekte kaç byte yer kaplayacağı sistemden sisteme değişebilir. Sistemlerin çoğunda, short int veri türünden yaratılan nesne bellekte 2 byte’lık bir alan kaplayacaktır. işaretli short int veri türünden bir nesne -32768 – +32767 aralığındaki tamsayı değerlerini tutabilirken, işaretsiz short türü söz konusu olduğıundan tutulabilecek değerler 0 – +65535 aralığında olabilir.
işaretli int (signed int) türü ve işaretsiz int (unsigned int) türü :
işaretli ve işaretsiz int veri türünden bir nesne tanımlandığı zaman, nesnenin bellekte kaç byte yer kaplayacağı sistemden sisteme değişebilir. Çoğunlukla 16 bitlik sistemlerde, int veri , 32 bitlik sistemlerde ise int veri türü 4 byte yer kaplamaktadır.
16 bitlik sistem, 32 bitlik sistem ne anlama geliyor.
16 bitlik sistem demekle işlemcinin yazmaç (register) uzunluğunun 16 bit oldugunu anlatıyoruz.
int veri türünün 2 byte uzunluğunda olduğu sistemlerde bu veri türünün sayı sınırları, işaretli int türü için -32768 – +32767, işaretsiz int veri türü için 0 – +65535 arasında olacaktır.
işaretli ve işaretsiz long int veri türü (işaretli uzun tamsayı türü – işaretsiz uzun tamsayı türü)
Bu türün ismini genellikle long int, ya da kısaca long türü olarak telaffuz edeceğiz.
işaretli ve işaretsiz long int veri türünden biriyle tanımlanan bir nesnenin bellekte kaç byte yer kaplayacağı sistemden sisteme değişebilir. Sistemlerin çoğunda, long int veri türünden yaratılan nesne bellekte 4 byte’lık bir alan kaplayacaktır. İşaretli long int veri türünden bir nesne -2147483648 – +2147483647 aralığındaki tamsayı değerlerini tutabilirken, işaretsiz long int türü söz konusu olduğıundan tutulabilecek değerler 0 – +4.294.967.296 aralığında olur.
GERÇEK SAYI TÜRLERİ
C dilinde gerçek sayı değerlerini tutabilmek için 3 ayrı veri türü tanımlanmıştır. Bunlar sırasıyla, float, double ve long double veri türleridir. Gerçek sayı veri türlerinin hepsi işaretlidir. Yani gerçek sayı veri türleri içinde hem pozitif hem de negatif değerler tutulabilir. Gerçek sayıların bellekte tutulması sistemden sisteme değişebilen özellikler içerebilir. Ancak sistemlerin çoğunda IEEE 754 sayılı standarda uyukmaktadır.
Sistemlerin hemen hemen hepsinde float veri türünden bir nesne tanımlandığı zaman bellekte 4 byte yer kaplayacaktır. 4 byte’lık yani 32 bitlik alana özel bir kodlama yapılarak gerçek sayı değeri tutulur. IEEE 754 sayılı standartta 4 byte’lık gerçek sayı formatı “single precision ” (tek hassasiyet) olarak isimlendirilmiştir. Bu standartta 32 bitlik alan 3 bölüme ayrılmıştır.
1 bitlik alan (sign bit): gerçek sayının işaret bilgisini yani pzoitif mi negatif mi olduğu bilgisini tutar.
8 bitlik alan (exponential part) :
23 bitlik alan (fraction part) : sayının ondalık kısmını tutar.
Sistemlerin hemen hemen hepsinde double veri türünden bir nesne tanımlandığı zaman bellekte 8 byte yer kaplayacaktır. Gerçek sayıların bellekte tutulması sistemden sisteme değişebilen özellikler içerebilir. Ancak sistemlerin çoğunda IEEE 754 sayılı standarda uyulmaktadır.
long double veri türünden bir nesne tanımlandığı zaman bellekte 10 byte yer kaplayacaktır.
C dilinin doğal veri türlerine ilişkin bilgileri aşağıda bir tablo şeklinde veriyoruz:
C DİLİNİN ÖNCEDEN TANIMLANMIŞ (DEFAULT ) VERİ TÜRLERİ
TAMSAYI TÜRLERİ(INTEGER TYPES)
TÜR İSMİ UZUNLUK(byte)(DOS / UNIX) SINIR DEĞERLERİ
signed char 1 -128 127
unsigned char 1 0 255
signed short int 2 -32.76 32.767
unsigned short int 2 0 65.535
signed int 2 4 -32.768 32.767
-2.147.483.648 2.147.483.647
unsigned int 2 4 0 65.535
0 4.294.967.296
long int 4 -2.147.483.648 2.147.483.647
unsigned long int 4 0 4.294.967.296
GERÇEK SAYI TÜRLERİ
(FLOATING TYPES)
TÜR İSMİ UZUNLUK (byte) SINIR DEĞERLERİ
en küçük pozitif değer en büyük pozitif değer
float 4 1.17 x 10-38 (6 basamak hassasiyet) 3.40 x 1038
double 8 2.22 x 10-308 (15 basamak hassasiyet) 1.17 x 10-38(15 basamak hassasiyet)
long double 10 taşınabilir değil
Yukarıda verilen tablo sistemlerin çoğu için geçerli de olsa ANSI C standartlarına göre yalnızca aşağıdaki özellikler garanti altına alınmıştır:
char türü 1 byte uzunluğunda olmak zorundadır.
short veri türünün uzunluğu int türünün uzunluğuna eşit ya da int türü uzunluğundan küçük olmalıdır. Yani
short <= int long veri türünün uzunluğu int türüne eşit ya da int türünden büyük olmak zorundadır. Yani long >= int
Derleyiciler genel olarak derlemeyi yapacakları sistemin özelliklerine göre int türünün uzunluğunu işlemcinin bir kelimesi kadar alırlar. 16 bitlik bir işlemci için yazılan tipik bir uygulamada
char türü 1 byte
int türü 2 byte (işlemcinin bir kelimesi kadar)
short türü 2 byte (short = int)
long türü 4 byte (long > int)
alınabilir.
Yine 32 bitlik bir işlemci için yazılan tipik bir uygulamada
char türü 1 byte
int türü 4 byte (işlemcinin bir kelimesi kadar)
short türü 2 byte (short < int)
long türü 4 byte (long = int)
alınabilir.
C dilinin en çok kullanılan veri türleri tamsaylar için int türü iken gerçek sayılar için double veri türüdür. Peki hangi durumlarda hangi veri türünü kullanmak gerekir. Bu sorunun cevabı olarak hazır bir reçete vermek pek mümkün değil, zira kullanacağımız bir nesne için tür seçerken bir çok faktör söz konusu olabilir, ama genel olarak şu bilgileri verebiliriz :
Gerçek sayılarla yapılan işlemler tam sayılarla yapılan işlemlere göre çok daha fazla yavaştır. Bunun nedeni şüphesiz gerçek sayıların özel bir şekilde belirli bir byte alanına kodlanmasıdır. Tamsayıların kullanılmasının yeterli olduğu durumlarda bir gerçek sayı türünün kullanılması , çalışan programın hızının belirli ölçüde yavaşlatılması anlamına gelecektir. Bir tamsayı türünün yeterli olması durumunda gerçek sayı türünün kullanılması programın okunabilirliğininin de azalmasına neden olacaktır.
Not: Alıntıdır














