Aşağıdaki kod ne yazdırır? int a = -1; unsigned int b = 1; if (a < b) ... (signed/unsigned karşılaştırma)
Cevap
Kod "a >= b" yazdırır. Signed ve unsigned aynı rütbedeki (rank) iki tamsayı karşılaştırıldığında, usual arithmetic conversions kuralı gereği signed değer unsigned'a çevrilir. -1, 32-bit unsigned int olarak 0xFFFFFFFF (4294967295) olur ve 1'den büyüktür.
#include <stdio.h>
int main(void)
{
int a = -1;
unsigned int b = 1;
if (a < b)
printf("a < b\n");
else
printf("a >= b\n"); /* bu yazdırılır */
return 0;
}Aynı tuzağın diğer klasik halleri
if (sizeof(int) > -1) /* sizeof size_t döndürür (unsigned) */
puts("buyuk");
else
puts("kucuk"); /* bu yazdırılır */
for (unsigned int i = 10; i >= 0; i--) /* sonsuz döngü: i asla < 0 olmaz */
;
size_t len = strlen(s);
if (len - 1 < 0) { } /* hiçbir zaman doğru değil, len 0 ise sarar */Önlemler
- Derleyicide
-Wall -Wextra -Wsign-compare -Wconversionuyarılarını açın. - Karşılaştırmadan önce açık cast yapın veya tipleri baştan uyumlu seçin.
- Negatif olabilecek değerler için signed, sayaç/indeks için
size_tkullanıyorsanız karışık karşılaştırmadan kaçının.
Not: short veya uint8_t gibi int'ten küçük tipler önce int'e yükseltilir (integer promotion); bu yüzden uint8_t ile -1 karşılaştırması farklı sonuç verir: (uint8_t)1 > -1 doğrudur.
İlgili C Programlama soruları
- C dilinde volatile anahtar kelimesi ne işe yarar?
- Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.
- Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?
- Endianness nedir? Little-endian ile big-endian farkı nedir?
- Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?
- Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.