Bilgisayar verilerinin her zaman, programın bu verileri nasıl yorumladığını açıklayan bir veri türü özniteliği vardır. Veri türü ayrıca bellekteki verilerin boyutunu (bayt cinsinden) belirler. Veri türleri iki sınıfa ayrılabilir: CPU'nun bir CPU kaydında tutabildiği ve doğrudan üzerinde çalışabildiği ve aşağıdaki daha küçük veri türlerinden oluşanlar. CPU'nun doğrudan üzerinde çalışabileceği atomik nesneleri tanımlamak için ilkel veri türü terimini kullanacağım ve daha küçük, ilkel veri türlerinden oluşan toplu nesneleri tanımlamak için bileşik veri türleri terimini kullanacağım. Aşağıdaki bölümlerde, çoğu modern CPU'da bulunan ilkel veri türlerini inceleyeceğiz.
1. Tamsayı Değişkenleri(Integer):
Çoğu programlama dili, tamsayı değerlerini bellek değişkenlerinde depolamak için bazı mekanizmalar sağlar. Genel olarak, bir programlama dili, tamsayı değerleri temsil etmek için işaretsiz ikili gösterimi, ikiye tümleyen gösterimi veya ikili kodlu ondalık gösterimi (veya bunların bir kombinasyonunu) kullanır. Bir programlama dilinde bir tamsayı değişkeninin belki de en temel özelliği, o tamsayı değerini temsil etmek için tahsis edilen bit sayısıdır. Çoğu modern programlama dilinde, bir tam sayı değerini temsil etmek için kullanılan bit sayısı genellikle 8, 16, 32, 64 veya 2'nin başka bir kuvvetidir. Çoğu dil, tam sayıları temsil etmek için yalnızca tek bir boyut sağlar, ancak bazı diller seçim yapmanıza izin verir. birkaç farklı boyuttan birinden. Boyutu, temsil etmek istediğiniz değer aralığına, değişkenin tüketmesini istediğiniz bellek miktarına ve bu değeri içeren aritmetik işlemlerin performansına göre seçersiniz. Tablo 1, çeşitli işaretli, işaretsiz ve ondalık tamsayı değişkenleri için bazı genel boyutları ve aralıkları listeler.
Tablo 1:
Boyut, İşaret Tıpı, Aralık
8 Unsigned 0..255
Signed −128..+127
Decimal 0..99
16 Unsigned 0..65,535
Signed −32768..+32,767
Decimal 0..9999
32 Unsigned 0..4,294,967,295
Signed −2,147,483,648..+2,147,483,647
Decimal 0..99999999
64 Unsigned 0..18,446,744,073,709,551,615
Signed −9,223,372,036,854,775,808..+9,223,372,036,854,775,807
Decimal 0..9999999999999999
128 Unsigned 0..340,282,366,920,938,463,463,374,607,431,768,211,455
Signed −170,141,183,460,469,231,731,687,303,715,884,105,728 .. +170,141,183,460,469,231,731,687,303,715,884,105,727
Decimal 0..99,999,999,999,999,999,999,999,999,999,999
Tüm diller bu farklı boyutların tümünü desteklemeyecektir (aslında, tüm bu farklı boyutları aynı programda desteklemek için muhtemelen assembly dili kullanmanız gerekir). Daha önce belirtildiği gibi, bazı diller yalnızca tek bir boyut sağlar; bu genellikle işlemcinin yerel tamsayı boyutudur (yani, bir CPU genel amaçlı tamsayı kaydının boyutu). Birden çok tamsayı boyutu sağlayan diller, genellikle size aralarından seçim yapabileceğiniz açık bir boyut seçeneği sunmaz. Örneğin, C programlama dili dört adede kadar farklı tamsayı boyutu sağlar: char (her zaman 1 bayttır), kısa, int ve uzun. Char türü dışında, C, kısa tamsayıların boyut olarak int nesnelerinden küçük veya onlara eşit olduğunu ve int nesnelerin boyut olarak uzun tamsayılardan küçük veya onlara eşit olduğunu belirtmek dışında bu tamsayı türlerinin boyutlarını belirtmez. (Aslında üçü de aynı boyutta olabilir.) Tamsayıların belirli bir boyutta olmasına bağlı olan C programları, ilk derleyici ile aynı boyutları kullanmayan farklı derleyicilerle derlendiğinde başarısız olabilir. Çeşitli programlama dillerinin, dil tanımında bir tamsayı değişkeninin boyutuna ilişkin kesin bir belirtim sağlamaktan kaçınması sakıncalı görünse de, bu belirsizliğin kasıtlı olduğunu unutmayın. Belirli bir programlama dilinde bir "tamsayı" değişkeni bildirildiğinde, dil, performansa ve diğer hususlara dayalı olarak bu tamsayı için en iyi boyutu seçmeyi derleyicinin uygulayıcısına bırakır. "En iyi" tanımı, derleyicinin kendisi için kod ürettiği CPU'ya göre değişebilir. Örneğin, 16 bitlik bir işlemci için bir derleyici, 16 bitlik tamsayıları uygulamayı seçebilir çünkü CPU bunları en verimli şekilde işler. Bununla birlikte, 32 bitlik bir işlemci için bir derleyici, 32 bitlik tamsayıları uygulamayı seçebilir (aynı nedenden dolayı). Çeşitli tamsayı biçimlerinin (Java gibi) tam boyutunu belirten diller, işlemci teknolojisi ilerledikçe zarar görebilir ve daha büyük veri nesnelerini işlemek daha verimli hale gelir. Örneğin, dünya genel amaçlı bilgisayar sistemlerinde 16 bit işlemcilerden 32 bit işlemcilere geçtiğinde, yeni işlemcilerin çoğunda 32 bit aritmetik yapmak aslında daha hızlıydı. Bu nedenle, derleyici yazarları, tamsayı aritmetiği kullanan programların performansını en üst düzeye çıkarmak için "tamsayı" yı "32 bit tamsayı" anlamına gelecek şekilde yeniden tanımladılar. Bazı programlama dilleri, işaretsiz tamsayı değişkenlerinin yanı sıra işaretli tamsayılar için destek sağlar. İlk bakışta, işaretsiz tamsayıları desteklemenin ardındaki tüm amaç, negatif değerler gerekmediğinde iki kat daha fazla pozitif değer sağlamak gibi görünebilir. Aslında, büyük programcıların verimli kod yazarken işaretsiz tamsayıları işaretli tamsayılar yerine seçmelerinin başka birçok nedeni vardır. Bazı CPU'larda işaretsiz tamsayı çarpma ve bölme, imzalı karşılıklarından daha hızlıdır. 0..n aralığındaki değerlerin karşılaştırılması, işaretli tamsayı yerine işaretsiz tamsayılar kullanılarak daha verimli bir şekilde yapılabilir (işaretsiz durumda n'ye karşı yalnızca tek bir karşılaştırma gerektirir); dizinin öğe dizinleri sıfırdan başladığında dizi dizinlerinin sınırlarını kontrol ederken bu özellikle önemlidir.
Birçok programlama dili, farklı boyutlardaki değişkenleri aynı aritmetik ifadeye dahil etmenize izin verir. Derleyici, nihai sonucu hesaplamak için gerektiği şekilde bir ifade içindeki işlenenleri otomatik olarak daha büyük boyuta imzalayacak veya sıfır genişletecektir. Bu otomatik dönüştürmeyle ilgili sorun, ifadeyi işlerken fazladan çalışma gerektiği gerçeğini gizlemesidir ve ifadelerin kendisi bunu açıkça göstermez.
x = y + z - t;
Bir ifadede farklı boyutlu tamsayılar kullanırken dikkat edilmesi gereken başka bir nokta da, tüm CPU'ların tüm işlenen boyutlarını verimli bir şekilde desteklemediğidir. CPU'nun genel amaçlı tamsayı kayıtlarından daha büyük bir tamsayı boyutu kullanmanın verimsiz kod üreteceği oldukça açık olsa da, daha küçük tamsayı değerleri kullanmanın da verimsiz olabileceği o kadar açık olmayabilir. Çoğu RISC CPU, yalnızca genel amaçlı kayıtlarla tam olarak aynı boyutta olan işlenenler üzerinde çalışır. Daha küçük işlenenler, bu değerleri içeren herhangi bir hesaplamadan önce sıfıra genişletilmeli veya genel amaçlı bir kayıt boyutuna işaretle genişletilmelidir. Farklı tamsayı boyutları için donanım desteğine sahip 80x86 gibi CISC işlemcilerde bile belirli boyutları kullanmak daha pahalı olabilir. Örneğin, 32-bit işletim sistemlerinde, 16-bit işlenenleri yöneten komutlar fazladan bir işlem kodu öneki baytı gerektirir ve bu nedenle, 8-bit veya 32-bit işlenenlerde çalışan yönergelerden daha büyüktür.
2. Floating-Point/Real Variables:
Tamsayılar gibi, birçok HLL birden çok kayan noktalı değişken boyutu sağlar. Çoğu dil, IEEE 754 kayan nokta standardına dayalı olarak en az iki farklı boyut, 32 bit tek duyarlıklı kayan nokta biçimi ve 64 bit çift duyarlıklı kayan nokta biçimi sağlar. Birkaç dil, Intel'in 80 bit genişletilmiş hassas kayan nokta biçimine dayalı olarak 80 bit kayan nokta değişkenleri sağlar, ancak bu tür kullanım nadir hale gelmektedir.
Farklı kayan nokta biçimleri, kesinlik için alan ve performanstan ödün verir. Daha küçük kayan nokta biçimlerini içeren hesaplamalar, genellikle daha büyük biçimleri içeren hesaplamalardan daha hızlıdır. Ancak, gelişmiş performans ve boyut tasarrufu elde etmek için hassasiyetten vazgeçersiniz. Tamsayı aritmetiği içeren ifadelerde olduğu gibi, bir ifadede farklı boyutlu kayan noktalı işlenenleri karıştırmaktan kaçınmalısınız. CPU (veya FPU), kullanmadan önce tüm kayan noktalı değerleri aynı biçime dönüştürmelidir. Bu, ek talimatlar (daha fazla bellek tüketme) ve ek süre içerebilir. Bu nedenle, mümkün olan her yerde bir ifade boyunca aynı kayan nokta türlerini kullanmaya çalışmalısınız. Tamsayı ve kayan nokta biçimleri arasında dönüştürme, kaçınmanız gereken başka bir pahalı işlemdir. Modern HLL'ler, değişkenlerin değerlerini mümkün olduğunca kayıtlarda tutmaya çalışır. Ne yazık ki, çoğu modern CPU'da, verileri önce belleğe kopyalamadan tamsayı ve kayan noktalı yazmaçlar arasında taşımak imkansızdır (bu pahalıdır, çünkü bellek erişimi, yazmaç erişimine kıyasla yavaştır). Ayrıca, tam sayı ve kayan noktalı sayılar arasındaki dönüşüm genellikle birkaç özel talimat içerir. Bütün bunlar zaman ve hafıza tüketir. Mümkün olduğunda, bu dönüşümlerden kaçının.
3. Karakter Değişkenleri(Character Variables):
Çoğu modern HLL'deki standart karakter verileri, karakter başına bir bayt tüketir. Intel 80x86 işlemci gibi bayt adreslemeyi destekleyen CPU'larda, bir derleyici her karakter değişkeni için tek bir baytlık depolama alanı ayırabilir ve bellekteki o karakter değişkenine verimli bir şekilde erişebilir. Bununla birlikte, bazı RISC CPU'ları, 32 bit parçalar (veya 8 bit dışında başka bir boyut) dışında bellekteki verilere erişemez. Bellekteki ayrı baytları adresleyemeyen CPU'lar için, HLL derleyicileri genellikle bir karakter değişkeni için 32 bit ayırır ve karakter verileri için yalnızca bu çift sözcüklü değişkenin LO baytını kullanır. Çok az program çok sayıda skaler karakter değişkenine sahip olduğundan, boşa harcanan alan miktarı çoğu sistemde neredeyse hiç sorun değildir.( Bu bağlamda skaler, "bir karakter dizisi değil" anlamına gelir) Ancak, paketlenmemiş bir karakter diziniz varsa, boşa harcanan alan önemli hale gelebilir. Modern programlama dilleri Unicode karakter setini destekler. Unicode karakterler, karakterin veri değerini tutmak için 2 bayt bellek gerektirir. Bayt veya sözcük adreslemeyi destekleyen CPU'larda, HLL derleyicileri genellikle bir Unicode karakter değişkeni için yalnızca 2 bayt ayırır. 32 bitten küçük nesnelere verimli bir şekilde erişemeyen CPU'larda, HLL derleyicileri genellikle 32 bit ayırır ve Unicode karakter verileri için yalnızca LO 16 bitlerini kullanır. Son zamanlarda, 16 bit, dünyanın tüm farklı alfabelerini ve simge kümelerini temsil edecek yeterli sayıda karakteri kodlayamadığı için, UTF-8 gibi çok baytlı karakter kümelerini kullanan uygulamalar başlamıştır. Bunlar, 1 ila 5 karakterlik değişken uzunluklu bir dizi kullanarak tek tek karakterleri kodlar.
4. Boolean Variables:
Bir Boole değişkeni, True veya False iki değeri temsil etmek için yalnızca tek bir bit gerektirir. HLL'ler genellikle bu tür değişkenler için mümkün olan en küçük bellek miktarını ayırır (bayt adreslemeyi destekleyen makinelerde bir bayt ve yalnızca sözcükleri veya çift sözcükleri adresleyebilen CPU'larda daha büyük miktarda bellek). HLL derleyicilerinin çoğu genellikle bir Boolean değişkeni için mümkün olan en küçük adreslenebilir belleği ayırsa da, bu her zaman böyle değildir. Bazı diller (örneğin C) açık bir Boolean veri türünü desteklemez. Boole değerlerini temsil etmek için bir tamsayı veri türü kullanırlar. Bu tür dillerde, Boole değerini tutmak için kullandığınız tamsayının boyutunu seçerek Boolean değişkenlerinizin boyutunu seçebilirsiniz. Örneğin, C/C++ dillerinin tipik bir 32 bit uygulamasında, burada gösterildiği gibi 1 bayt, 2 bayt veya 4 bayt Boole değerleri tanımlayabilirsiniz:
Bazı diller, belirli koşullar altında, bir Boolean değişkeni bir kayıt alanı veya bir dizinin öğesi olduğunda, bu değişken için yalnızca tek bir bit depolama kullanır.