İşlem Öncesi Otomatik Tür Dönüştürmeleri

Derleyici 2 operantlı bir operatörle karşılaştığında önce operantların türlerine bakar. Eğer operantlar aynı türdense işlem yapılır, işlem sonucunda elde edilen değerin türü bu ortak tür türündendir. Eğer operantlar farklı türlerdense, önce operantlar aynı türe dönüştürülür. Sonuç bu ortak tür türünden çıkar. Özet olarak, küçük tür büyük türe dönüştürülmektedir. Örneğin; int ile long işleme sokulsa, int türü long türüne dönüştürülür. sonuç long türünden çıkar. Yalnızca değişkenlerin ve sabitlerin değil, genel olarak her ifadenin bir türü vardır.
Küçük türün büyük türe dönüştürülmesi geçici değişken yoluyla yapılmaktadır. Yani, derleyici önce büyük tür türünden geçici bir değişken yaratır, küçük türü ona atar. Sonra işlemde bu geçici değişkeni kullanır ve en sonunda bu geçici değişkeni yok eder.

Bölme işleminde iki operantın tam sayı türlerine ilişkinse sonuç, noktadan sonraki kısmı atılarak tam sayı çıkar.
Büyük türün, küçük türe dönüştürülme kuralının da bazı ayrıntıları vardır.

1. İşlemler en az int duyarlılığında yapılmaktadır. Bu nedenle operantların her ikiside ya da tek operantlı operatörlerde, bu tek operant int türünden küçük türlere ilişkinse, bu durumda önce her iki operantta int türüne dönüştürülür. sonuç int türünden çıkar. Yani örneğin; iki short türünü toplarsak sonuç int türden çıkar. Örneğin:

2. Anımsanacağı gibi küçük işaretli türden büyük işaretli türe dönüştürme yoktur. Bu durumda örneğin; int türüyle ulong türü işleme sokulursa, int türünün ulong türüne dönüştürülmesi gerekir ki böyle bir otomatik dönüştürme yoktur. O halde aralarında otomatik dönüştürme olmayan türler işleme sokulamaz. Örneğin biz, int türüyle ulong türünü işleme sokamayız. Benzer biçimde double ile decimal türlerinide beraber işleme sokamayız. Fakat istisna olarak, int ile uint türü işleme sokulabilir. Bu durumda bu türlerin her ikiside long türüne dönüştürülür ve sonuç long türden çıkar.
3. Tam sayı türleri ile gerçek asyı türleri işleme sokulursa, dönüştürme her zaman gerçek sayı türünde doğru yapılır. Yani örneğin; float türü ile long türü işleme sokulursa sonuç float türünden çıkar.

Tür Dönüştürme Operatörü

Bazen işlem öncesinde biz, bir ifadenin türünü bilinçli olarak başka bir türe dönüştürmek isteyebiliriz. Örneğin;

Burada, sonucun double çıkmasını sağlamak için a ya da b’yi işlem öncesinde bilinçli olarak double türüne dönüştürmemiz gerekir.

Tür dönüştürme operatörü tek operantlı ön ek bir operatördür. Öncelik tablosunda soldan sağa ikinci düzeyde bulunur.

Burada a / b işleminin sonucu double türüne dönüştürülmektedir. Tür dönüştürme operatörü sağdan sola önceliklidir. Dolayısıyla a önce long türüne sonra double türüne dönüştürülür. Tür dönüştürme işlemi yine geçici değişken yaratılıp yapılmaktadır.
Tür dönüştürme operatörü ile bool türü dışında her türü diğerine dönüştürebiliriz. Yani bu operatörle biz bilgi kaybına yol açıcı dönüştürmelerde yapabiliriz. Örneğin;

Büyük türden küçük türe tür dönüştürmesi yapıldığında bilgi kayıplarının nasıl oluşacağı belirlenmiştir.

1. Eğer kaynak tür ile belirtilen değer (yani dönüştürülmek istenen değer) hedef türün (yani dönüştürülmek istenen türün) sınırları içerisinde kalıyorsa bilgi kaybı oluşmaz.
2. Eğer kaynak tür ile belirtilen değer hedef türün sınırları içerisinde kalmıyorsa sayının yüksek anlamlı byte değerleri atılır, düşük anlamlı byte değerleri atanır. Sayının yüksek anlamlı byte değerleri atıldığında elde edilen değer ilkiyle alakasız hatta ters işaretli bile olabilir.

3. Gerçek sayı türlerinden tam sayı türlerine dönüştürme yapıldığında sayının noktadan sonraki kısmı atılır, tam kısmı elde edilir. Eğer sayının noktadan sonraki kısmı atıldığı halde sayı hala hedef türün sınırları içerisinde kalmıyorsa rastgele bir değer elde edilebilir.

4. Aynı tam sayı türünün işaretli ve işaretsiz biçimleri arasında dönüştürme yapıldığında sayının bit kalıbı değişmez. Fakat işaret bitinin anlamı değişir.
5. Küçük işaretli türden büyük işaretsiz türe dönüştürme 2 aşamada yapılır. Birinci aşamada büyük türün işaretli biçimine dönüştürme uygulanır. İkinci aşamada büyük türün işaretli biçiminden, büyük türün işaretsiz biçimine dönüştürme uygulanır.

6. decimal türünden, float ve double türüne dönüştürme yapıldığında decimal değere en yakın büyük ya da küçük değer elde edilir. float ve double türlerinden decimal türüne dönüştürme yapıldığında yine en yakın değer elde edilmektedir.

Küçük tür büyük türe dönüştürüldükten sonra yapılan işlem, hedef türün sınırları dısında kalırsa, bu duruma taşma(overflow) denir. Taşma oluşursa içinde bulunduğumuz duruma göre bir davranış oluşur. Eğer kontrollü (checked) bir ortam (context) içerisindeysek exception oluşur. Eğer kontrolsüz (unchecked) bir ortamda çalışıyorsak, bu durumda sayının yüksek anlamlı byte değerleri atılır. Default durum kontrolsüz ortamdır.Kontrollü ortamda derleme yapmak için komut satırında “/checked” seçeneği kullanılır. Örnek:

csc /checked sample.cs

Aynı işlem IDE’den project settingse gelinerek build/advanced içinden Check for arithmetic overflow/underflow seçeneği ile yapılır.

Değişkenlerin Ömürleri

Değişkenin bellekte yaşadığı zaman aralığına ömür denir. Yerel değişkenler, programın akışı onların bildirildikleri noktaya geldiğinde yaratılır, akış onların bildirildikleri bloktan çıktığında otomatik yokedilir. Yani yerel değişkenler bellekte sürekli yer kaplamaz. Yerel değişkenler stack te yaratılmaktadır. Zaten bir yerel değişkene onun bildirildiği bloğun dışından erişilememesinin nedeni aslında o yerel değişkenin o bloğun dışında yaşamıyor olmasındandır.
Yerel değişkenler stack te çok hızlı yaratılır.

Parametre Değişkenlerinin Ömürleri

Metodun parametre değişkenleri, metod çağrıldığında yaratılır, metodun çalışması bittiğinde yokedilir. Stack te yaratılır.
Adres Kavramı ve Değişkenlerin Adresleri
Bellekteki her bir byte’ye, ilk byte sıfır olmak üzere, ardışıl bir sayı karşılık düşürülmüştür. Bu sayıya ilgili byte’nin adresi denir. Her değişkenin bir adresi vardır. 1 byte’den uzun olan değişkenlerin adresleri, onların en düşük adresleriyle ifade edilir.


Sınıfların Veri Elemanları

Bildirimi, sınıf bildirimi içerisinde yapılan değişkenlere sınıfın veri elemanları denir. Sınıfın veri elemanları erişim belirleyicisine sahip olabilir. Static olabilir ya da olmayabilir. Biz şimdilik erişim belirleyicisi olarak public kullanacağız.

Yerel değişkenler erişim belirleyicisine sahip olamaz. Static (tür) belirleyicisinede sahip olamaz.
Sınıflar aynı zamanda türde belirtir. Yani bir sınıf türünden bildirimler yapılabilir. Örneğin: Sample a, b;
Burada a ve b sample türündendir.

Leave a Reply

Site Footer