08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

ch == 135<br />

karşılaştırma işleminde char türden olan ch değişkeni, karşılaştırma işlemi öncesi signed<br />

int türüne yükseltilir. İşlem öncesi tamsayıya yükseltme sonucu, yüksek anlamı byte'ler<br />

1 bitleriyle beslenir. Çünkü ch negatif bir değere sahiptir. Karşılaştırma işlemi öncesinde<br />

ch'nin değeri<br />

1111 1111 1000 0111<br />

olur. Oysa karşılaştırma işlecinin sağ terimi olan 135 değeri, int türden bir değişmezdir.<br />

Yani aslında karşılaştırılan değerler aşağıdaki gibi olur:<br />

1111 1111 1000 0111<br />

0000 0000 1000 0111<br />

Karşılaştırma yanlış olarak sonuçlanır.<br />

Tamsayıya Yükseltme<br />

Daha önce de açıklandığı gibi tamsayıya yükseltme (integral promotion), bir ifade içinde<br />

bulunan char, unsigned char, short, unsigned short türlerinin, ifadenin derleyici<br />

tarafından değerlendirilmesinden önce, otomatik olarak int türüne dönüştürülmeleri<br />

anlamına gelir.<br />

Peki dönüşüm, signed int türüne mi, unsigned int türüne mi yapılır?<br />

Genel kural şudur: Tür dönüşümüne uğrayacak terimin değeri int türünde ifade<br />

edilebiliyorsa int, edilemiyorsa unsigned int türüne dönüşüm yapılır.<br />

Örneğin unsigned short ve int türlerinin aynı uzunlukta olduğu DOS işletim sisteminde<br />

unsigned short türü, tamsayıya yükseltilirken unsigned int türüne dönüştürülür.<br />

Eğer tam sayıya yükseltilecek değer, signed char, unsigned char ya da signed short<br />

türlerinden ise, dönüşüm signed int türüne yapılır.<br />

Bilgi kaybı ile ilgili şu hususu da göz ardı etmemeliyiz. Bazı durumlarda bilgi kaybı tür<br />

dönüşümü yapıldığı için değil yapılmadığı için oluşur. Sınır değer taşmaları, bu duruma iyi<br />

bir örnek olabilir.<br />

Örnek: (DOS altında çalıştığımızı düşünelim)<br />

long x = 1000 * 2000;<br />

Yukarıdaki kod ilk bakışta normal gibi görünüyor. Zira çarpma işleminin sonucu olan<br />

2000000 değeri DOS altında signed long türü sayı sınırları içinde kalır. Oysa bilgi kaybı<br />

atama işleminden önce gerçekleşir. 1000 ve 2000 int türden değişmezlerdir, işleme<br />

sokulduklarında çarpma işlecinin de ürettiği değer int türden olur. Bu durumda 2 byte<br />

uzunlukta olan int türü, 2000000 değerini tutamayacağı için yüksek anlamlı byte<br />

kaybedilir. 2000000 onaltılık sayı sisteminde 0x1E8480 olarak gösterilebilir. Yüksek<br />

anlamlı byte kaybedilince işlem sonucu, 0x8480 olur. 0x8480 negatif bir sayıdır. Çünkü<br />

işaret biti 1'dir. İkiye tümleyenini alırsak<br />

0x8480 1000 0100 1000 0000<br />

ikiye tümleyeni 0111 1011 1000 0000 (0x7B80 = 31616)<br />

Görüldüğü gibi işlem sonucu üretilecek değer –31616 dir. Bu durumda x değişkeninin<br />

türü long türü de olsa, atanacak değer –31616 olur.<br />

İşlev Çağrılarında Tür Dönüşümü<br />

Daha önce söylendiği gibi, bir işleve gönderilen argümanlarla, bu argümanları tutacak<br />

işlevin parametre değişkenleri arasında tür farkı varsa otomatik tür dönüşümü gerçekleşir<br />

132/529

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!