Temel Türler
Bir bilgisayarın beyninin mikro işlemci olduğunu gördük. Bir programdaki işlemlerin çoğunu mikro işlemci işletir. Kendi yapamayacağı işleri ise bilgisayarın yan birimlerine devreder.
Bilgisayarlarda en küçük bilgi birimi, 0 veya 1 değerini tutabilen ve bit adı verilen yapıdır.
Yalnızca 0 ve 1 değerini tutabilen bir veri türünün kullanımı çok kısıtlı olduğundan, mikro işlemciler birden fazla bitin yan yana getirilmesinden oluşan daha kullanışlı veri türleri tanımlamışlardır: örneğin 8 bitten oluşan bayt veya 32, 64, vs. bitten oluşan daha büyük veri türleri. Eğer türlerden N bitlik olanı bir mikro işlemcinin en etkin olarak kullandığı tür ise, o mikro işlemcinin N bitlik olduğu söylenir: "32 bitlik işlemci" veya "64 bitlik işlemci" gibi.
Mikro işlemcinin tanımladığı veri türleri de kendi başlarına yeterli değillerdir çünkü örneğin öğrenci ismi gibi veya oyun kağıdı gibi özel bilgileri tutamazlar. Mikro işlemcinin sunduğu bu genel amaçlı veri türlerini daha kullanışlı türlere çevirmek programlama dillerinin görevidir. Örneğin, oyun kağıdı gibi kavramlar, ileride anlatılacak olan yapılarla ve sınıflarla ama yine de temel türlerden yararlanarak ifade edilirler.
D'nin temel türleri diğer dillerin temel türlerine benzerler. Bu türlerin ayrıntılarını sonraki bölümlerde göreceğiz.
Mantıksal ifade türü
Mantıksal ifadelerde kullanılan ve "doğruluk" durumunda true
, "doğru olmama" durumunda false
değerini alan türdür:
Tür | Açıklama | İlk Değer |
---|---|---|
bool | Bool değeri | false |
Tamsayı türleri
Tamsayılar, küsuratı olmayan sayılardır. Örneğin, 3 bir tamsayıdır ama 3.5 değildir. (Not: Çoğu programlama dilinde olduğu gibi, kesirler D dilinde de Türkçe yazım kurallarından farklı olarak virgülle değil, nokta ile ayrılır. O yüzden, normalde 3,5 olarak yazılması gereken değerleri metin içinde bile 3.5 olarak yazacağım.)
Hem eksi hem artı değer alabilen türler işaretli türlerdir. İsimleri eksi işaretinden gelir. Yalnızca artı değerler alabilen türler ise işaretsiz türlerdir. Bu türlerin isimlerinin başındaki u
harfi, "işaretsiz" anlamına gelen "unsigned"ın baş harfidir.
Tür | Açıklama | İlk Değer |
---|---|---|
byte | işaretli 8 bit | 0 |
ubyte | işaretsiz 8 bit | 0 |
short | işaretli 16 bit | 0 |
ushort | işaretsiz 16 bit | 0 |
int | işaretli 32 bit | 0 |
uint | işaretsiz 32 bit | 0 |
long | işaretli 64 bit | 0L |
ulong | işaretsiz 64 bit | 0LU |
Kesirli sayı türleri
Kayan noktalı diye de anılan ve 1.25 gibi kesirli değerleri tutabilen türlerdir. Hesapların hassasiyeti türlerin bit sayısıyla doğru orantılıdır; yüksek bit sayısı yüksek hassasiyet sağlar. Bunların dışındaki türler kesirli değerler alamazlar. Örneğin int
, yalnızca tamsayı değerler alabilir. nan
, "not a number"ın kısaltmasıdır ve geçersiz kesirli sayı değeri anlamına gelir.
Tür | Açıklama | İlk Değer |
---|---|---|
float | 32 bit | float.nan |
double | 64 bit | double.nan |
real | en az 64 bit ama donanım desteğine göre daha fazla da olabilir | real.nan |
Karakter türleri
Bu türler harfleri ve metinle ilgili başka her türlü işareti ifade etmek için kullanılırlar:
Tür | Açıklama | İlk Değer |
---|---|---|
char | UTF-8 kod birimi | 0xFF |
wchar | UTF-16 kod birimi | 0xFFFF |
dchar | UTF-32 kod birimi ve Unicode kod noktası | 0x0000FFFF |
Bunlara ek olarak hiçbir türden olmama kavramını ifade eden void
anahtar sözcüğü vardır.
cent
ve ucent
anahtar sözcükleri, işaretli ve işaretsiz 128 bitlik veri türlerini temsil etmek üzere ilerisi için ayrılmışlardır.
Aksine bir neden bulunmadığı sürece genel bir kural olarak tam değerler için int
, kesirli değerler için ise double
türü uygundur.
Tür nitelikleri
Türler hakkında bilgi edinmek amacıyla kullanılan niteliklere türün isminden sonra bir nokta ve nitelik ismiyle erişilir. Örneğin, int
'in sizeof
niteliğine int.sizeof
diye erişilir. Tür niteliklerinin yalnızca bazılarını burada göreceğiz; gerisini sonraki bölümlere bırakacağız:
-
.stringof
türün okunaklı ismidir -
.sizeof
türün bayt olarak uzunluğudur (kaç bitten oluştuğunu hesaplamak için bu değeri bir bayttaki bit sayısı olan 8 ile çarpmak gerekir) -
.min
"en az" anlamına gelen "minimum"un kısaltmasıdır; türün alabileceği en küçük değerdir -
.max
"en çok" anlamına gelen "maximum"un kısaltmasıdır; türün alabileceği en büyük değerdir -
.init
"ilk değer" anlamına gelen "initial value"nun kısaltmasıdır; belirli bir tür için özel bir değer belirtilmediğinde kullanılan değer budur
Bu nitelikleri int
türü üzerinde gösteren bir program şöyle yazılabilir:
import std.stdio; void main() { writeln("Tür : ", int.stringof); writeln("Bayt olarak uzunluğu: ", int.sizeof); writeln("En küçük değeri : ", int.min); writeln("En büyük değeri : ", int.max); writeln("İlk değeri : ", int.init); }
Programın çıktısı:
Tür : int Bayt olarak uzunluğu: 4 En küçük değeri : -2147483648 En büyük değeri : 2147483647 İlk değeri : 0
size_t
Programlarda size_t
türü ile de karşılaşacaksınız. size_t
bütünüyle farklı bir tür değildir; ortama bağlı olarak ulong
veya başka bir işaretsiz temel türün takma ismidir. İsmi "size type"tan gelir ve "büyüklük türü" anlamındadır. Adet gibi saymayla ilgili olan kavramları temsil ederken kullanılır.
Asıl türünün sisteme göre farklı olmasının nedeni, size_t
'nin programın kullanabileceği en büyük bellek miktarını tutabilecek kadar büyük bir tür olmasının gerekmesidir: 32 bitlik sistemlerde uint
ve 64 bitlik sistemlerde ulong
. Bu yüzden, 32 bitlik sistemlerdeki en büyük tamsayı türü size_t
değil, ulong
'dur.
Bu türün sizin ortamınızda hangi temel türün takma ismi olduğunu yine .stringof
niteliği ile öğrenebilirsiniz:
import std.stdio; void main() { writeln(size_t.stringof); }
Yukarıdaki programı denediğim ortamda şu çıktıyı alıyorum:
ulong
Problem
Diğer türlerin de niteliklerini yazdırın. Notlar:
- İlerisi için düşünüldükleri için geçersiz olan
cent
veucent
türlerini hiçbir durumda kullanamazsınız. - Hiçbir türden olmamayı temsil eden
void
türünün.min
,.max
, ve.init
nitelikleri yoktur. - Karakter türlerinin
.min
,.max
, ve.init
değerlerinin okunur karakter karşılıkları yoktur. .min
niteliği kesirli sayı türleriyle kullanılamaz. Eğer bu problemde bir kesirli sayı türünü.min
niteliği ile kullanırsanız derleyici bir hata verecektir. Daha sonra Kesirli Sayılar bölümünde göreceğimiz gibi, kesirli sayı türlerinin en küçük değeri için.max
niteliğinin eksi işaretlisini kullanmak gerekir (örneğin,-double.max
).