back to top

C++ 2.Ders (Veriler ve Veri Tipleri)

Bu yazımda, pek çok programlama dili gibi C++ programlama dilinde de programlama süreçlerinde çok önemli bir yere sahip olan ve iyi bir hafıza yönetimi için bilinmesi gereken temel bir konu olan veri tiplerinden bahsedeceğim.

Ayrıca elektronik aygıtlarımızın verilerimizi nasıl sakladığı ve işlediğiyle alakalı temel bir konu olan birler ve sıfırlardan veyanısıra ASCII kodlama sisteminden de kısaca bahsedeceğim.

Elektronik Aygıtlarımız Verileri Nasıl Saklar?

Verilerimiz normal bilgisayarlarımızda veya elektronik aletlerimizde, birler ve sıfırlardan oluşan bir sistem ile muhafaza edilmekte ve yine bu sistem sayesinde aygıtlarımız pek çok işlemi gerçekleştirebilmektedir. Elektronik aletlerimizde belli bir gerilim değerinin üzerindeki gerilimler bir, altındaki gerilimler işe sıfır olarak anlamlandırılır. Birler ve sıfırlar yan yana gelerek üstel artan bir şekilde farklı anlamları temsil edebilir hale gelirler, örneğin sekiz bitten oluşan yani bir bytelık bir veri 2^8=256 dan 0 ila 255 arasındaki 256 farklı değeri temsil edebilir. Eğer bir bellek bölgesine saklayabileceğinden daha büyük bir veri yazmaya çalışırsanız, veriniz doğru şekilde saklanamayacaktır. Mesela sadece pozitif değerler için kullanılan bir hafıza bölgesine maksimum değer aralığını aşan bir veri kaydetmemeye çalışırsanız, sayınız ilgili bellek bölgesinin alabileceği değer adedine bölünerek, bu işlemden kalan sayı bellek bölgesine kayıt edilecektir. Bu veri kodlama sistemi sayesinde elektronik aygıtlarımız gerilim seviyelerini anlamlandırarak günümüzdeki sayısız karmaşık işlemi hızlı bir şekilde yerine getirebilmektedir. Ayrıca sıkça duymuş olduğunuz 32 bitlik 64 bitlik gibi tabirler, cihazınızın verileri kaç bitlik diziler halinde kodladığı ile alakalı bir terimdir.

Bellekte saklamış olduğumuz birler ve sıfırlar, dahil oldukları dizideki sağ baştan konumlarına (n) göre, o sıradaki bir veya sıfırla değerin bulunduğu sıranın karşılık geldiği üstel değerin (2^(n-1)) çarpılıp, dizideki her bir elemana bu işlemin uygulanıp toplanması ile dizinin sayısal karşılığı hesaplanabilir.

Örneğin 8 bitlik 00000101 ifadesi 1* ( 2^(3-1) + 2^(1-1) ) + 0*( 2^(2-1) + 2^(4-1) + 2^(5-1) + 2^(6-1) + 2^(7-1) + 2^(8-1) ) işlemi ile hesaplandığı üzere 5 değerine karşılık gelir.

Elektronik aygıtlarımızda verilerimiz, verilerimizi temsil eden bit guruplarımıza eşlenmiş olarak bulunan bellek adresleri vasıtasıyla düzende tutulmakta ve rahatlıkla amaçlarımız doğrultusunda kullanılabilmektedir.

ASCII

ASCII’nin açılımı American Standard Code for Information Interchange’dır, Türkçesi işe Bilgi Değişimi için Amerikan Standart Kodu anlamına gelmektedir. ASCII elektronik aygıtların iletişimi için geliştirilmiş bir karakter kodlama standardıdır. ASCII elektronik cihazlarda metin yapılarının ortak bir şekilde anlamlandırılabilmesi için geliştirilmiş, başlarda sadece Amerika’da kullanılmakta olan sonralarda işe bilgisayarların yaygınlaşması ile tüm dünyaca kabul görmüş bir standarttır.

Aşağıdaki tablo www.computerhope.com adresinden alınmış olup, standart ASCII tablosunun 0 ila 127 arasındaki decimal yani ondalık değerlerinin karakter ve binary karşılıklarını içermektedir. Decimal yani ondalık sayı sistemi gündelik hayatta kullanmış olduğumuz sayı sistemine karşılık gelmektedir. Birler ve sıfırlardan oluşan binary yani ikilik sistemdeki bir ifadeyi, yukarıda vermiş olduğum örnekte olduğu gibi ikilik sistemden ondalık sisteme dönüştürebilirsiniz.

CharDecBinaryCharDecBinaryCharDecBinary
!03300100001A06501000001a09701100001
03400100010B06601000010b09801100010
#03500100011C06701000011c09901100011
$03600100100D06801000100d10001100100
%03700100101E06901000101e10101100101
&03800100110F07001000110f10201100110
03900100111G07101000111g10301100111
(04000101000H07201001000h10401101000
)04100101001I07301001001i10501101001
*04200101010J07401001010j10601101010
+04300101011K07501001011k10701101011
,04400101100L07601001100l10801101100
04500101101M07701001101m10901101101
.04600101110N07801001110n11001101110
/04700101111O07901001111o11101101111
004800110000P08001010000p11201110000
104900110001Q08101010001q11301110001
205000110010R08201010010r11401110010
305100110011S08301010011s11501110011
405200110100T08401010100t11601110100
505300110101U08501010101u11701110101
605400110110V08601010110v11801110110
705500110111W08701010111w11901110111
805600111000X08801011000x12001111000
905700111001Y08901011001y12101111001
:05800111010Z09001011010z12201111010
;05900111011[09101011011{12301111011
<06000111100\09201011100|12401111100
=06100111101]09301011101}12501111101
>06200111110^09401011110~12601111110
?06300111111_09501011111_12701111111
@06401000000`09601100000
Standart ASCII Tablosu ( 33 – 127 )

Veri Tipleri

Numerik Veri Tipleri

Numerik veri tipleri içerisinde sayısal değerler tutmaktadırlar. Saklamak istediğimiz sayısal değerler pozitif, negatif, büyük, küçük veya küsuratlı bir sayı olması durumuna göre farklı bir veri tipi kullanarak saklamayı gerektirebilir. C++ programlama dilinde zaman zaman derleyiciye göre veri tiplerinin RAM’de kaplamış olduğu alan değişebilmektedir.

Signed olan veri tipleri içerisinde pozitif veya negatif verileri saklayabilirken, unsigned olan veri tipleri sadece pozitif verileri saklayabilmektedir.

Eğer unsigned ve signed iki veriyi bir if yardımı ile karşılaştırmaya çalışırsanız, unsigned olan veri signed veri tipine dönüştürülerek karşılaştırılacaktır ve benzer bir şekilde, unsigned iki değişken ile gerçekleştirilen matematiksel işlemin sonucunun negatif çıkması gibi durumlarda programınızın yanlış çalışmasına sebep olabilir. Bahsetmiş olduğum bu tarz problemler yazımın ilerleyen kısımlarında anlatacağım veri tiplerinde de yaşanabilmektedir, bu sebepten dolayı C++ programlama dilinde değişkenlerimiz için tanımlamış olduğumuz veri tiplerini ayarlarken veya bu değişkenleri işlemlere tabi tutarken mümkün olduğunca özenli olmak ve doğru veri türleri ile çalışmak önem arz etmektedir.

Float ve double veri tipleri küsuratlı sayıları saklamak için kullanılır. Float veri türünde 7 basamağa, double veri türünde işe 15 basamağa kadar sayısal veriler saklanabilmektedir.

Aşağıdaki tablo yapbenzet.kocaeli.edu.tr adresinden alınmıştır.

Tür AdıKaç ByteTakma AdıDeğer Aralığı
int4signed–2,147,483,648 ila 2,147,483,647
unsigned int4unsigned0 ila 4,294,967,295
__int81char-128 ila 127
unsigned __int81unsigned char0 ila 255
__int162short, short int, signed short int–32,768 ila 32,767
unsigned __int162unsigned short, unsigned short int0 ila 65,535
__int324signed, signed int, int–2,147,483,648 ila 2,147,483,647
unsigned __int324unsigned, unsigned int0 ila 4,294,967,295
__int648long long, signed long long–9,223,372,036,854,775,808 ila 9,223,372,036,854,775,807
unsigned __int648unsigned long long0 ila 18,446,744,073,709,551,615
short2short int, signed short int-32,768 ila 32,767
unsigned short2unsigned short int0 ila 65,535
long4long int, signed long int–2,147,483,648 ila 2,147,483,647
unsigned long4unsigned long int0 ila 4,294,967,295
long long8none–9,223,372,036,854,775,808 ila 9,223,372,036,854,775,807
unsigned long long8none0 ila 18,446,744,073,709,551,615
float4none3.4E +/- 38 (7 basamak)
double8none1.7E +/- 308 (15 basamak)
long double8none1.7E +/- 308 (15 basamak)
Veri Tipleri

Numerik Veri Tipleri için Örnek Uygulamalar

Aşağıdaki kod bloğu ile f ve g değişkenlerinin karşılık geldiği -5 ve 15 sayıları alt alta ekrana yazdırılacaktır ve sonrasında unsigned int negatif bir sayı saklayamayacağı için -8 yerine bam başka bir sayı ekrana yazdırılacaktır.

#include <iostream>
int main()
{
    int f = -5;
    unsigned int g = 15;
    unsigned int h = -8;
    std::cout << f << "\n";
    std::cout << g << "\n";
    std::cout << h;
}

Aşağıdaki kod bloğu ile signed yapıda olan k ve l değişkenlerinin karşılık geldiği -14 ve 14 sayıları alt alta ekrana yazdırılacak ve sonrasında unsigned yapıda olan i değişkeninin karşılık geldiği 16 sayısı ekrana yazdırılacaktır.

#include <iostream>

int main()
{
    int k{ -14 };
    int l(14);
    unsigned int i{ 16 };
    std::cout << k << "\n";
    std::cout << l << "\n";
    std::cout << i;
}

Aşağıdaki kod bloğu ile tanımlamış olduğumuz değişken tiplerimiz birer byte’lık veri tipleri olduğu için ekrana yazdırırken derleyicimiz bu verileri numerik değil karakter olarak algılayıp ekrana ASCII tablosundaki karakter karşılıklarını yazdıracaktır. m ve p değişkenlerini E ve – karakterleri olarak ekrana yazdırılırken, n değişkenini taşma gerçekleşeceği için taşma sonrasında elde edeceğimiz sayı olan 69 sayısından dolayı 69 sayısının ASCII karşılığı olan E harfi olarak ekrana yazdıracaktır.

#include <iostream>

int main()
{
    unsigned __int8 m = 69;
    unsigned __int8 n = 256 + 69;
    __int8 p = 45;
    std::cout << m << "\n" << n << "\n";
    std::cout << p;
}

Karakter Veri Tipleri

karakter veri tipleri bizim hafızada karakterleri yani harf, işaret, boşluk gibi verileri saklamamıza yarayan veri tipleridir. Eğer karakter türünde bir değişken tanımlayıp içerisine bir sayı yerleştirmeye çalışırsak bu sayısal değerimiz ASCII tablosunda karşılık geldiği değere göre anlamlandırılacaktır. Ancak karakter veri türündeki değişkenlerimizle matematiksel işlemler gerçekleştirirsek işlemimizde bu değişkenlerimizin sayısal karşılıklarını işleme tabi tutmuş oluruz.

Char m[] = “Nasılsın” : bu ve benzeri bir ifade kullanarak bir karakter dizsini değişkenimizin içerisinde saklayabiliriz. Bu şekilde bir veriyi depoladığımızda dizimizin içerisindeki her bir karakter hafızamızda birer byte yer kaplar.

Aşağıdaki tablo yapbenzet.kocaeli.edu.tr adresinden alınmıştır.

Tür AdıKaç ByteTakma AdıDeğer Aralığı
char1nonevarsayılan olarak –128 ila 127 /j kullanılarak derlendiğinde 0 ila 255
signed char1none-128 ila 127
unsigned char1none0 ila 255
wchar_t, char16_t, and char32_t2 or 4__wchar_t0 ila 65,535 (wchar_t & char16_t), 0 ila 4,294,967,295 (char32_t)
Karakter Veri Tipleri

Karakter Veri Tipleri için Örnek Uygulamalar

Aşağıdaki kod bloğu ile x değişkeninin içermiş olduğu a harfi ekrana yazdırılacaktır.

#include <iostream>
int main()
{
    char x = 'a';
    std::cout << x;
}

Aşağıdaki kod bloğu ile öncelikle 118 sayısının ASCII karşılığı olan v harfi ekrana yazdırılacak ve ‘<< “\n” ‘ ifadesi sayesinden imleç alt satıra geçirilecektir sonrasında gerçekleştirilen işlem matematiksel bir işlem olduğu için v harfinin ASCII karşılığı olan değerden 118 çıkarılarak a-e işleminin sonucu 0 olarak ekrana yazdırılacaktır.

#include <iostream>
int main()
{
    char e = 118;
    char a = 'v';
    std::cout << e << "\n";
    std::cout << a-e;
}

Aşağıdaki kod bloğu ile Ö harfinin ASCII kodunu ekrana yazdırmış oluruz.

#include <iostream>
int main()
{   
    char z = 'Ö';
    std::cout << z + 0;
}

Aşağıdaki kod bloğu ile “umarim iyisinizdir.” cümlesindeki karakterlerin her biri hafızada birer byte yer kaplayacak şekilde m değişkeninin içerisine kaydedilecek ve ekrana yazdırılacaktır.

#include <iostream>
int main()
{
    char m[] = "umarim iyisinizdir.";
    std::cout << m;
}

Mantıksal (Bool) Veri Tipi

Mantıksal bir veri tipi olan bool genelde bir olayın gerçekleşip gerçekleşmediğini yada doğruluğunu kontrol etmek amacıyla kullanılan, bir ve sıfır olmak üzere başka bir deyişle doğru ve yanlış olmak üzere iki farklı durumu ifade eden bir veri tipidir. Bool veri tipindeki bir değişkenin içerisinde yalnızca bir veya sıfır durumu saklanabilmektedir. Bool veri tipindeki bir değişkene değer atarken biri True sıfırı işe False ifadesi ile tayin edebiliriz. Bool veri tipindeki bir değişken bellekte bir byte yer kaplamaktadır.

Mantıksal (Bool) Veri Tipi için Örnek Uygulamalar

Aşağıdaki kod bloğu ile ekrana alt alta gelecek şekilde sırasıyla 0101 yazılacaktır.

#include <iostream>
int main()
{
    bool x_off = false;
    bool x_on = true;
    bool a_off = 0;
    bool a_on = 1;
    std::cout << x_off << "\n" << x_on << "\n" << a_off << "\n" << a_on;
}

Ek Olarak Bahsedilmesi Gerekenler

auto: Bu ifade ile oluşturmuş olduğumuz değişkene otomatik olarak veri tipi atanmasını sağlayabiliriz ama programımızın derlenme süresini uzatacaktır.

Aşağıdaki kod bloğu ile sırasıyla 1998 15.15 V yan yana veri tipleri cümlesi de bir alt satırda olacak şekilde ekrana yazdırılacaktır.

#include <iostream>
int main()
{  
    auto x{ 1998 };
    auto y{ 15.15 };
    auto z{ "V" };
    auto w{ "veri tipleri" };
    std::cout << x << y << z << "\n" << w;
}

wchar_t: standart ASCII tablosunda bir byte ile temsil edilemeyen, 2 ila 4 baytla temsil edilen karakterler için kullanılan bir veri türüdür.

const: Bir değişkenin değerini sabit olarak ayarlamamızı sağlar. Başında const ifadesi kullanılan değişkenlerin içerdiği değerler, programlama sürecinde const ifadesi kaldırılmadıkça değiştirilemez değerler haline gelir. const ile tanımladığınız bir değişkene programlama sürecinde yeni bir değer atamamızı derleyici engelleyecektir.

#include <iostream>
int main()
{     
    const char x[] = "merhaba sahip";
    std::cout << x;
}

static_cast<dönüşeceği veri tipi>(dönüşecek veri veya değişken): Herhangi bir veri tipinde tanımlanmış olduğumuz değişkeni başka bir veri tipine dönüştürmemizi sağlar. Bu ifade sayesinde doğrudan verilerimizin tiplerini de değiştirebiliriz.

Aşağıdaki kod bloğu ile öncelikle float veri tipindeki 18.18 sayısı, int veri tipine dönüştürülecek ve ekrana 18 yazdırılacak, ardından alt satıra karakter veri tipine dönüştürülen 65.5 sayısından dolayı, 65 ondalık değerinin ASCII karşılığı olan A harfi yazdırılacaktır.

#include <iostream>
int main()
{    
    float no1{ 65.5 };
    static_cast<char>(no1);
    std::cout << static_cast <int> (18.18);
    std::cout << "\n";
    std::cout << static_cast <char> (no1);
}

Son Çıkan Yazılar

1 Yorum

CEVAP VER

Lütfen yorumunuzu giriniz!
Lütfen isminizi buraya giriniz