Platform
Programlama

4. Türler - C++

Değişken türleri ve diğer teknik detaylar.

resul · Editör, Yazar· 2 Ağustos 2026· 7 dk okuma

Bu derse geçmeden önce bir hususu belirtmek istiyorum. Bu derste çok fazla terim var dolayısıyla ezberlemek zorunda değilsiniz. Ezberlemek yerine genel mantığını anlayın yeterli. Sadece bu derste bulunması için ekledim ileride dönüp bakarsınız belki. Böyle yine bir kaç ders olacak aralarda. Hepsinde burasını tamamen ezberlemek zorunda değilsiniz diye belirtirim.

Türlerin detaylarına girelim.

int

C++’ta int veri türü, yaygın olarak kullanılan 64 bit bilgisayarlarda genellikle 4 bayt (32 bit) yer kaplar. Ancak C++ standardı, int türünün her bilgisayarda kesinlikle 4 bayt olmasını beklemez. Yalnızca belirli minimum boyut ve aralık koşullarını garanti eder. Bu nedenle, bir int değişkeninin boyutunu öğrenmek için sizeof(int) kullanılabilir. Yani hangi bilgisayarda kullanıyorsanız ve int değişkeninin bayt anlamında büyüklüğüne bakabilirsiniz sizeof ile.

32 bitlik bir int, toplam 2³² (4.294.967.296) farklı değeri temsil edebilir. İşaretli (signed) int türünde bu değerler negatif ve pozitif sayıları kapsar. Beklenen bir 32 bit int için değer aralığı −2.147.483.648 (dahil) ile 2.147.483.647 (dahil) arasındadır. Bu aralıkta toplam 4.294.967.296 farklı değer bulunur.

Ancak negatif sayılara ihtiyaç duyulmuyorsa unsigned int kullanılabilir. Bu tür, aynı boyutta olduğundan negatif olan kısımdaki değerler pozitifte yer kaplar dolayısıyla unsigned için signed a göre iki kat fazla pozitif değer tutabilir diyebiliriz. Yani signed yaklaşık -2 milyar ile +2 milyar arasında değer tutarken beklenen bir 32 bit unsigned int için 0 ve yaklaşık 4 milyar değer aralığındadır. Tam değer 0 ile 4.294.967.295 (dahil) arasındadır.

Özetle, 32 bitlik signed int ve unsigned int genellikle aynı miktarda bellek (4 bayt) kullanır. Ancak değer aralıkları farklıdır: signed int hem negatif hem pozitif sayıları temsil ederken, unsigned int yalnızca sıfır ve pozitif tam sayıları temsil eder. Böylece unsigned int, aynı bit sayısıyla daha büyük pozitif değerleri saklayabilir.
int ile signed int aynı şeydir. Yani bir değişken

cpp
int para = 3;
cpp
signed int para = 3;

olarak ifade edilirse aynı şey olur.

cpp
int a = 5; 				//signed yani işaretli (pozitif değer)
int b = -5;				//signed yani işaretli (negatif değer almış gördüğünüz gibi)
signed int c = 15;			//aynı şey yani signed
signed int d = -15;			//signed
signed int e = 3123123123;		// 32 bit signed'a sığmaz; = ile derleme hatası olmak zorunda değil, sonuç güvenilmez. int e{3123123123}; daraltma hatası verir
unsigned int f = 3123123123;		// unsigned aralığa sığar; 32 bit unsigned'ta hatasız
signed g = 123123; //sadece signed kullanımı da int ile aynı şey. yani `int` , `signed int` , `signed` aynı şeydir.

Önceki derslerde bahsettiğim {} kullanmıyorum anlaşılması için. O yüzden "hem alışkanlık kazanın diyon hem de kullanmıyon" demeyin xD. Yani sadece int i anlatıyorum işin içine hata imkanı girdiği zaman örneklerde de {} kullanacağım.

C++ yerleşik integer türleri

Sırasıyla char-short-int(düz)-long belirteçleri küçükten büyüğe tamsayı merdivenidir. Tablodaki boyut ve uçlar tipik değerlerdir, her platformun garantisi değil. Kendi derleyicinde sizeof ve numeric_limits bak.

TürTipik boyutMinimum değerMaksimum değer
signed char1 byte−128127
unsigned char1 byte0255
short / short int / signed short / signed short int2 byte−32.76832.767
unsigned short / unsigned short int2 byte065.535
int / signed / signed int4 byte−2.147.483.6482.147.483.647
unsigned / unsigned int4 byte04.294.967.295
long / long int / signed long / signed long int (Windows)4 byte−2.147.483.6482.147.483.647
unsigned long / unsigned long int (Windows)4 byte04.294.967.295
long / long int / signed long / signed long int (yaygın 64 bit Linux)8 byte−263263 − 1
unsigned long / unsigned long int (yaygın 64 bit Linux)8 byte0264 − 1
long long / long long int / signed long long / signed long long int8 byte−263263 − 1
unsigned long long / unsigned long long int8 byte0264 − 1

auto ne zaman?

Bir ifadenin türü, değerinden açıkça anlaşılabiliyorsa auto kullanabilirsiniz ancak değeri türü hakkında yeterli bilgi vermiyorsa veya özellikle belirli bir türü kullanmak istiyorsanız, türü doğrudan belirtin. Mesela

cpp
#include <string>

auto adet = 3;                    // int
auto ad = std::string{"Ada"};     // std::string
auto a{99999999};                 // int
auto b{3000000000};               // Windows: long long, 64-bit Linux: long
auto c{99999999999U};             // Windows: unsigned long long (U her zaman belli bir unsigned türünü belirtmez, hangisine sığarsa onu seçer)
auto d{99999999999};              // Windows: long long
auto e{99999999L};                // long
auto f{99999999LL};               // long long

gördüğünüz üzere auto, değeri sığdırabildiği değişkene tanımlar. Eğer büyük bi sayının türünü signed yerine unsigned olmasını istiyorsanız sayının sonuna U kısaltmasını koyabiliriz. Long olarak algılanması için L , long long algılanması içinse LL koyarız.

auto, uzun türlerde genelde kullanılır. int x{3} gibi kısa yerlerde çok önemli değil.

C++ yerleşik ondalıklı türler

Kesirli sayılar float, double ve long double ile tutulur. Bunların unsigned versiyonu yoktur .Aşağıdaki tablodaki minimum ve maksimum, tutabildiği en negatif ve en pozitif sonlu değerdir; yaklaşık yazıyorum çünkü uçlar tam sayı gibi net değil.

Asıl fark, ondalıklı olduğu için kaç basamağın doğru kaldığı ile ölçülür. float yaklaşık 7, double yaklaşık 15 anlamlı basamak tutar. Windows'ta boyut derleyiciye göre değişir.

MSVC'de (diğer derleyici) long double, double ile aynıdır:yani 8 byte. MinGW-w64 (GCC- bizim kullandığımız) ile 16 byte tutulur, 80 bit geniş hassasiyeti vardır (açıklıcam ama gerek yok tamamen anlamana). Yaygın 64 bit Linux'ta da genelde 16 byte, yaklaşık 18–19 basamağa tekabül eder.

Geniş hassasiyet (extended precision), standart double türüne kıyasla daha fazla anlamlı basamağı koruyabilen bir kayan noktalı sayı biçimidir. Örneğin, 80 bitlik geniş hassasiyetli biçim; sayının işaretini, üs bilgisini ve anlamlı kısmını daha geniş bir gösterimle saklayarak yuvarlama hatalarını azaltabilir. Ancak daha fazla bellek kullanabilir dolayısıyla her platformda aynı şekilde desteklenmemesi ve işlemciye bağlı farklılıklar göstermesi beklenebilir. Ayrıca long double adının kullanılması, her sistemde mutlaka daha yüksek hassasiyet sağlandığı anlamına gelmez. (cppreference)

Sıfıra en yakın pozitif sayı bu uçlardan çok daha küçüktür. float için yaklaşık 1.2 × 10⁻³⁸, double için yaklaşık 2.2 × 10⁻³⁰⁸.

TürTipik boyutMinimum değerMaksimum değer
float4 byteyaklaşık −3.4 × 1038yaklaşık 3.4 × 1038
double8 byteyaklaşık −1.8 × 10308yaklaşık 1.8 × 10308
long double (Windows, MSVC)8 byteyaklaşık −1.8 × 10308yaklaşık 1.8 × 10308
long double (Windows, MinGW-w64)16 byteyaklaşık −1.2 × 104932yaklaşık 1.2 × 104932
long double (yaygın 64 bit Linux)16 byteyaklaşık −1.2 × 104932yaklaşık 1.2 × 104932

C++ yerleşik karakter türleri

signed char ve unsigned char tam sayı tablosunda yer alır. char ise bunlardan ayrı bir türdür ve çoğunlukla metin karakterlerini temsil etmek için kullanılır. İşaretli olup olmadığını C++ standardı belirlemez; Windows ve Linux'ta kullanılan derleyiciye bağlı olarak değişebilir.
wchar_t geniş karakter türüdür. Windows'ta genellikle 2 byte, yaygın 64 bit Linux sistemlerinde 4 bytedır. char8_t, char16_t ve char32_t sırasıyla UTF-8, UTF-16 ve UTF-32 kod birimlerini temsil eder. Üçü de işaretsiz türdür. char8_t, C++20 ile eklenmiştir.

TürTipik boyutMinimum değerMaksimum değer
char (tipik işaretli; standart zorlamaz)1 byte−128127
wchar_t (Windows)2 byte065.535
wchar_t (yaygın 64 bit Linux)4 byte−231231 − 1
char8_t (C++20)1 byte0255
char16_t2 byte065.535
char32_t4 byte04.294.967.295

Önemli nokta: eğer unsigned iseler anlattığım gibi başlangıç değerleri 0 olur ve alabilecekleri pozitif değerleri yaklaşık iki katına çıkar. Tabloda signed ve unsigned için ayrı ayrı yazmadım. Anladığınızı varsayıyorum.

C++ yerleşik mantıksal tür

bool yalnızca iki değer tutar: false ve true. Pratikte 1 byte yer kaplar. Başka bir yazılışı yoktur.

TürTipik boyutMinimum değerMaksimum değer
bool1 bytefalse (0)true (1)

Diğer sık kullanılan türler

(Özellikle bu kısmı şimdi öğrenmenize gerek yok. Dersi sırayla takip ediyorsanız.) void değer tutmaz. Fonksiyon bir şey döndürmüyorsa dönüş türü void olur. std::nullptr_t yalnızca nullptr tutar; 64 bit'te bir işaretçi kadar, yani 8 byte yer kaplar.
std::size_t bir boyuttur, işaretsizdir. std::ptrdiff_t iki işaretçi arasındaki farktır, işaretlidir. İkisi de yerleşik tür değil, standart kütüphanedeki takma addır. 64 bit Windows ve Linux'ta ikisi de beklendiği gibi 8 byte'tır.
std::byte tek bir baytın kendisidir, sayı değildir. Üzerinde toplama çıkarma yapılmaz.

TürTipik boyutMinimum değerMaksimum değer
std::size_t (64 bit)8 byte0264 − 1
std::ptrdiff_t (64 bit)8 byte−263263 − 1

Bu ders bu kadardı. std isim uzayında çok fazla tür var. Onlara ileride geçeceğiz.

Kaynaklar

Editör · Yazarresul
cppprogramlama