08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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

ifadesinde pow işlevinin geri dönüş değeri double türden olduğu için, int türden olan i<br />

değişkeni de, işlemin yapılabilmesi için geçici bir bölgede double türünde ifade edilerek<br />

işleme sokulur.<br />

Atama Tür Dönüşümleri<br />

Bu tür dönüşümlerin çok basit bir kuralı vardır: Atama öncesinde, atama işlecinin sağ<br />

tarafındaki ifade, atama işlecinin sol tarafındaki nesnenin türünde ifade edilir:<br />

Küçük türlerin büyük türlere dönüştürülmesinde bilgi kaybı söz konusu değildir. Örneğin:<br />

double leftx;<br />

int righty = 5;<br />

leftx = righty;<br />

Yukarıdaki örnekte righty değişkeninin türü int'tir. Önce double türe otomatik dönüşüm<br />

yapılır, daha sonra double türünde ifade edilen righty değişkeninin değeri leftx<br />

değişkenine atanır.<br />

Aşağıda 16 bitlik sistemler için bazı örnekler veriliyor:<br />

TÜR desimal hex dönüştürülecek tür hex desimal<br />

int 138 0x008A long int 0x0000008A 138L<br />

char 'd' (100) 0x64 int 0x0064 100<br />

int -56 0xFFC8 long int 0xFFFFFFFC8 -56L<br />

char '\x95' (- 0x95 int 0xFF95 -107<br />

07)<br />

unsigned int 45678 0xB26E long int 0X0000B26EL 45678<br />

char '0' (48) 0x30 long int 0x00000030L 30L<br />

Negatif olan bir tamsayı, küçük türden büyük türe dönüştürüldüğünde sayının yüksek<br />

anlamlı bitleri, negatifliğin korunması amacıyla 1 biti ile beslenir.<br />

Derleyici tarafından yapılan atama tür dönüşümlerinde, atama öncesi, büyük türün küçük<br />

türe dönüştürülmesi durumunda bilgi kaybı söz konusu olabilir.<br />

Aşağıdaki basit kurallar verilebilir:<br />

Eğer atama işlecinin her iki tarafı da tam sayı türlerinden ise (char, short, int, long),<br />

atama işlecinin sağ tarafının daha büyük bir türden olması durumunda bilgi kaybı olabilir.<br />

Bilgi kaybı ancak, atama işlecinin sağ tarafındaki değerin, sol taraftaki türün sınırları<br />

içinde olmaması durumunda söz konusu olur. Bilgi kaybı, yüksek anlamlı byte'ların<br />

kaybolması şeklinde ortaya çıkar. Örnek:<br />

long m = 0x12345678;<br />

int y = m;<br />

printf ("m = %x\n", m);<br />

Yukarıdaki örnekte int türden olan y değişkenine long türden bir değişkenin değeri<br />

atanmıştır. Kodun 16 bitlik bir sistemde, örneğin DOS altında çalıştığını düşünüyoruz.<br />

DOS altında int türü için sayı sınırları –32768 +32767 değerleridir. Bu sayılar da, iki<br />

byte'lık bir alan için işaretli olarak yazılabilecek en büyük ve en küçük değerlerdir.<br />

Onaltılık sayı sisteminde her bir basamak 4 bite ve her iki basamak 1 byte alana karşılık<br />

gelir. Dolayısıyla 0x12345678 sayısı 8 hex basamak, yani 4 byte uzunluğunda bir sayıdır.<br />

Oysa atamanın yapılacağı nesne int türdendir ve bu tür max. 4 hex basamak (2 byte)<br />

uzunlukta olabilir. Bu durumda m değişkenine ilişkin değerin yüksek anlamlı 2 byte'ı yani<br />

(4 hex basmağı) yitirilir. Atama işleminden sonra, printf işleviyle, y değişkeninin değeri<br />

5678 olarak yazdırılır.<br />

130/529

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

Saved successfully!

Ooh no, something went wrong!