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 -Wconversion uyarı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_t kullanı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.

  1. C dilinde volatile anahtar kelimesi ne işe yarar?OrtaC ProgramlamaEmbedded
  2. Bir yazmaçtaki belirli bir biti set, clear ve toggle eden C kodunu yazın.KolayC ProgramlamaEmbedded
  3. Stack ile heap arasındaki fark nedir? Gömülü sistemlerde dinamik bellek kullanımından neden kaçınılır?OrtaC ProgramlamaEmbedded
  4. Endianness nedir? Little-endian ile big-endian farkı nedir?KolayC ProgramlamaEmbedded
  5. Bit field nedir? Donanım register'larına erişimde bit field mi yoksa bit maskesi mi kullanılmalı?OrtaC ProgramlamaEmbedded
  6. Fonksiyon pointer'ları ve callback tabloları gömülü sistemlerde nasıl kullanılır? Bir state machine örneği verin.OrtaC ProgramlamaEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle