C dilinde ifadelerde sıklıkla tür dönüşümleri (type promotion, type conversion) standart tarafından düzenlenir:
char, short) otomatik olarak int veya unsigned int türüne dönüştürülür.Ö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.
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.
Hikaye
Görüntü yoğunluklarının ortalamasını hesaplamada
intveunsigned intkarış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_tile hesapladılar, ancak diziyeintüzerinden indekslendiler. Dizi sınırını kontrol ederkenint i >= size_t lenkarşı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ı".