C programlama #Bölüm 4# Detaylı int Veri Tipi

C programlama dili eğitim serimizin önceki bölümünde veri tiplerine göz atmıştık, şimdi tam sayıların hafızada kapladıkları alanlara bakacağız. Bir önceki dersi incelemek için buraya tıklayabilirsiniz.


Programlama dilleri insan dillerine ne kadar yakın olurlarsa olsun en temelde tüm makineler birbirleri ile bitler şeklinde haberleşirler. Dolayısıyla bitler, ikilik tabandadır. Tamam tamam yani bitler 0 ve 1 sayılarının yan yana gelerek oluşturduğu ifadelerdir.

En önemlisi makinelerin bitler halinde haberleştiğini öğrendik. Mesela değişkenler üzerinde işlem yapılması ve istenilen yere çağırması için hafızada taşıdığımız ifadelerdi. Sonuç olarak değişkenler bitler halinde bellekte depolanmaktadır.

Ek olarak bilgisayarda bit grupları büyüklüklerine göre şu şekilde isimlendirilir.

  • 8Bit = 1Byte
  • 1024Byte = 1 KiloByte (Kb)
  • 1024Kb = 1 MegaByte (Mb)
  • 1024Mb = 1 GigaByte (Gb)
  • 1024Gb = 1 TeraByte (Tb)

Değişkenlerin İkilik Tabanda Kapladığı Alanlar

Şimdi bu kavramların hepsini öğrendiğimize göre bizim tam sayı veri tipimiz bellekte ne kadar yer kapladıklarına bir bakalım. Bunu için bir örnek kod kullanıyor olacağız.

1
2
3
4
5
6
7
#include<stdio.h>

int main(){
    printf("%d", sizeof(int));

    return 0;
}

Örnek kod üzerinde gördüğümüz sizeof fonksiyonu kısaca değişkenlerin hafızada kapladığı alanı görebilmemize yarayan hazır bir fonksiyon. Sonuç olarak bu kodu derleyip çalıştırdığımızda görüyoruz ki bizim tam sayı veri tiplerimiz bellekte 4 byte'lık yer kaplıyormuş, belki sizin bilgisayarınızda 2 byte'lık yer kaplıyor olabilir.

Bu değeri bit olarak ifade edersek tam sayılar 2 byte = 16 bitlik veya 4 byte = 32 bitlik yer kaplıyormuş.


Örneğin gündelik hayatımızda biz insanların kullandığı sayı sistemi onluk tabandadır. Onluk tabanda basamaklar;

  • 10⁰ Birler Basamağı
  • 10¹ Onlar Basamağı
  • 10² Yüzler Basamağı
  • 10³ Binler Basamağı

Öte yandan makinelerin kullandığı sayı sistemi, ikilik tabandakiler;

  • 2⁰ Birler Basamağı
  • İkiler Basamağı
  • Dörtler Basamağı
  • Sekizler Basamağı

Ardından bu basamak ifadelerini kullanarak bitlerin en fazla alabildiği sayıyı hesaplayalım. Sıfırı çıkartırsak, sonuç olarak 2ⁿ - 1 formülünü kullanarak en fazla alabildiği sayıyı hesaplayabiliriz.


Değişken Türlerinin Sınırları

Tam sayı veri tipinin en fazla ne kadar değer taşıyabildiğini hesaplayalım.

2 byte'lık yada 16 bitlik tam sayı veri tipi (int) için en düşük alabileceği değer 0, en fazla alabileceği değer 2¹⁶ - 1 = 65.535 yani alabileceği sayı aralığı {0, 65535} olur.

4 byte'lık yada 32 bitlik tam sayı veri tipi (int) için en düşük alabileceği değer 0, en fazla alabileceği değer 2³² - 1 = 4.294.967.295 yani alabileceği sayı aralığı {0, 4294967295} olur.

Kısaca bu sayı aralıkları sıfır ve pozitif sayı değerleri kapsadığı için unsigned int (işaretsiz tam sayı) veri tipi olarak isimlendirilir.


Fakat negatif sayı değerlerini de ekleyecek olursak sayı aralıklarını baştan düşünmeliyiz.

Sonucunda 2 byte'lık yada 16 bitlik tam sayı veri tipi (int) için alabileceği sayı aralığı {-32768, 32767} olur.

Sonucunda 4 byte'lık yada 32 bitlik tam sayı veri tipi (int) için alabileceği sayı aralığı {-2147483648, 2147483647} olur.

Kısaca negatif sayılarında katıldığı bu veri tipi signed int (işaretli tam sayı) veri tipi olarak isimlendiriliyor.


Şimdi örnekler ile bu aralıkların sınırlarını terminal ekranında yazdıralım.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include<stdio.h>
#include<limits.h>

int main(){
    unsigned int alt = 0;
    unsigned int ust = UINT_MAX;

    printf("{%d, %d}", alt, ust);

    return 0;
}

Sonuç olarak terminal ekranında unsigned int veri tipinin sınırlarını "{0, 4294967295}" olarak görmüş oluruz. (Sizde tam sayı veri tipi 2 byte'lık olabilir)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include<stdio.h>
#include<limits.h>

int main(){
    short signed int alt = SHRT_MIN;
    short signed int ust = SHRT_MAX;

    printf("{%d, %d}", alt, ust);

    return 0;
}

Aynı şekilde terminal ekranında short signed int veri tipinin sınırları "{-32768, 32767}" görmüş oluruz.


Tam sayı veri tiplerinin 2 byte veya 4 byte yer kaplayabileceğini söylemiştik. Yani 2 byte'lık olan tam sayı değerini seçebilmek için short int veri tipini tercih ediyoruz. Aynı şekilde 4 byte'lık olan tam sayı değerini seçebilmek için long int veri tipini tercih etmemiz gerekir.

Peki ya çok çok yüksek tam sayı değerlerimizi hangi veri tipinde tutmamız gerekecek? Bu durumda long long int veri tipini kullanırız. Bu veri tipi 8 byte'lık hafıza alanına sahiptir.


Sınırı Aşma Durumu Saat Mantığı

Özetlemek gerekirse buraya kadar veri tiplerinin alabilecekleri sayı aralıklarını görmüş olduk. 4 byte'lık unsigned int değişkeninin alabileceği en fazla sayı değeri 4294967295 olarak söylemiştik. Peki ya bu veri tipinde bir değişken 4294967296 sayı değerini alırsa ekranda ne yazdırmış oluruz? Şimdi de bunu bir kod ile deneyerek görelim.

1
2
3
4
5
6
7
8
9
#include<stdio.h>

int main(){
    unsigned int num = 4294967296;

    printf("%d", num);

    return 0;
}

Bu örnek kodu derleyip çalıştırırsak terminal ekranında "0" yazdığını görmüş oluruz.

Bu durumu farklı bir şekilde inceleyebiliriz. İkilik tabanda 2 bitlik (2 basamaklı) bir sayıyı düşünelim.

  • _00 = 0
  • _01 = 1
  • _10 = 2
  • _11 = 3
  • 100 = 0
  • 101 = 1

Yukarıdaki ikilik tabanda 2 bitlik sayı sayma örneğimizde gördüğümüz gibi 2 bit için en fazla alabileceği değer 2ⁿ - 1 = 3 Çünkü, 3 sayısını geçince bizim hafızamızın kapladığı 2 bitlik alandan taşıyor. Şöyle düşünebiliriz. Bu veri tipleri saat gibi dairesel şekilde uçtan uca birbirine bağlı 12 den sonra 1 e geçmiş oluyoruz. Tekrar baştan sayıyoruz.

Bu örneği signed int bir veri tipi için düşünürsek sayı aralığı {-32768, 32767} bu değişkene 32768 sayı değeri vermek istersek ekranda -32768 yazacaktır. Çünkü saat gibi uçtan uca birbirlerine bağlı ve baştan saymaya başlar.


Tamam lafı çok uzattık, o zaman şimdi genel bir tablo ile hafızada kapladıkları alanları özetleyelim.

Veri TipiHafızada kapladığı alan
int2 byte veya 4 byte
short int2 byte
long int4 byte
long long int4 byte

Sonuç olarak sıklıkla kullanacağımız tam sayı veri tiplerinin bilgisayar karşısında nasıl bir anlam taşıdığını öğrenmiş olduk.


Bir sonraki bölümümüzde benzer şekilde ondalıklı sayı (float) veri tipini inceliyeceğiz. Bu makaleye buradan ulaşabilirsiniz.