ProgramlamaC geliştirici

C dilinde ifadelerde hangi tür dönüştürme (type conversion, type promotion) kuralları uygulanır? Beklenmeyen hatalar ve çözümlerden örnekler verin.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

C dilinde ifadelerde sıklıkla tür dönüşümleri (type promotion, type conversion) standart tarafından düzenlenir:

  • Tam Sayı Terfisi: daha düşük hassasiyete sahip türler (örneğin, char, short) otomatik olarak int veya unsigned int türüne dönüştürülür.
  • Genel Aritmetik Dönüşümler: operandlar farklı türlerde olduğunda, belirli kurallara göre "daha geniş" bir türde dönüştürülür.
  • İşaretli ve işaretsiz türler arasında karışık işlemler yapıldığında, sonuç dönüşüm nedeniyle beklenmedik şekilde değişebilir.

Örnek:

unsigned short a = 65535; signed short b = -1; printf("%d\n", a + b); // dönüşüme bağlı!

Öneri: Operandların türlerine dikkat edin, özellikle bit işlemleri, dizi uzunlukları ve endekslerle çalışırken, işaretli ve işaretsiz türler arasında örtük karıştırmaktan kaçının.

Tuzak Sorusu

Aşağıdaki kod parçası ne çıkartır?

unsigned int u = 1; int i = -2; printf("%d\n", u + i);

Cevap: i değişkeni unsigned int türüne dönüştürülecek, sonuç çok büyük bir değer alacak, çünkü sonuç özünde: 1U + (unsigned int)-2U, bu da UINT_MAX'a (4294967295) yakın bir sayı verir. printf formatı int olarak ayarlanmadığı sürece negatif bir sayı yazdırılmaz, aksi takdirde çöplük olacaktır.

Konunun ince detaylarından dolayı gerçek hata örnekleri


Hikaye

Görüntü yoğunluklarının ortalamasını hesaplamada int ve unsigned int karıştırıldı. Negatif değerler unsigned üzerinden yanlış bir şekilde iletildi ve devasa sayılara yol açarak görüntü tamponunun taşmasına sebep oldu.


Hikaye

Gömülü yazılımda dizinin uzunluğunu size_t ile hesapladılar, ancak diziye int üzerinden indekslendiler. Dizi sınırını kontrol ederken int i >= size_t len karşılaştırmasını yaptılar, bu da uzun diziler için mantığı bozdu ve farklı türler arasında karşılaştırmalardan dolayı hatalara yol açtı (size_t - işaretsiz).


Hikaye

Finans projesindeki bir geliştirici negatif sayılar için % ile kalanı hesapladı ve negatif operandlar için sonucun işareti uygulamaya bağlı olduğunu unuttu. Bir ortamda sonuç pozitif, diğerinde negatif olduğu için hesaplamalar zaman zaman "kaydı".