SORU
24 Mart 2011, PERŞEMBE


İmzalı/imzasız karşılaştırma

Aşağıdaki kodu belirtilen yere bir uyarı sorun değil neden anlamaya çalışıyorum.

//from limits.h
#define UINT_MAX 0xffffffff /* maximum unsigned int value */
#define INT_MAX  2147483647 /* maximum (signed) int value */
            /* = 0x7fffffff */

int a = INT_MAX;
//_int64 a = INT_MAX; // makes all warnings go away
unsigned int b = UINT_MAX;
bool c = false;

if(a < b) // warning C4018: '<' : signed/unsigned mismatch
    c = true;
if(a > b) // warning C4018: '<' : signed/unsigned mismatch
    c = true;
if(a <= b) // warning C4018: '<' : signed/unsigned mismatch
    c = true;
if(a >= b) // warning C4018: '<' : signed/unsigned mismatch
    c = true;
if(a == b) // no warning <--- warning expected here
    c = true;
if(((unsigned int)a) == b) // no warning (as expected)
    c = true;
if(a == ((int)b)) // no warning (as expected)
    c = true;

Arka plan tanıtım ile ilgisi olduğunu sanıyordum, ama son iki aksini söylüyor gibi görünüyor.

Bana göre == ilk karşılaştırma sadece diğerleri kadar imzalı/imzasız bir uyumsuzluk var mı?

CEVAP
24 Mart 2011, PERŞEMBE


Karşılaştırma imzasız imzalı, derleyici imzasız imzalı değer dönüştürür. Eşitlik için, bu, -1 == (unsigned) -1 önemi yok. Aşağıdakiler doğrudur, örneğin, önemli diğer bir karşılaştırma için: -1 > 2U.

EDİT: Referanslar:

5/9: (İfadeler)

İkili operatörler birçok bekliyoruz aritmetik veya numaralandırma işlenen tip dönüşümleri ve verim neden benzer şekilde, tür sonuç. Bu amaç ortak bir tür verim. ayrıca sonuç türüdür. Bu desen her zamanki denir hangi aritmetik dönüşümleri, aşağıdaki gibi tanımlanmış

  • Ya işlenen türü uzun çift. Diğer Uzun getirilecektir çift.

  • Ya da işlenen aksi takdirde, çift, diğeri de öyle olacak. çift dönüştürülür.

  • Aksi takdirde, eğer ya da işlenen şamandıra, yüzer getirilecektir.

  • Aksi takdirde, integral promosyonlar (4.5) üzerinde gerçekleştirilecektir işlenen.54)

  • Ya da işlenen sonra, diğer olacaktır imzasız uzun imzasız uzun dönüştürülür.

  • Eğer bir işlenen aksi halde, uzun int ve diğer imzasız int, sonra eğer uzun bir int tüm temsil eğer imzalanmamış int, değerleri imzalanmamış int a çevrilir long int; aksi halde her iki işlenen imzasız uzun getirilecektir int.

  • Eğer ya da işlenen aksi halde, uzun, diğer getirilecektir uzun.

  • Ya da işlenen aksi takdirde, imzasız, diğeri de öyle olacak. imzasız dönüştürülür.

4.7/2: (İntegral dönüşümleri)

Eğer hedef türü işaretsiz ise, elde edilen değer en azından. işaretsiz tamsayı denir kaynak tamsayı (mod 2nn bulunduğu bit sayısını temsil etmek için kullanılan yazın imzasız). İki [not: tamamlayıcı, bu temsili kavramsal ve dönüşüm var. bit deseni (varsa değişiklik yok hayır kesme). ]

EDİT2: MSVC uyarı seviyeleri

MSVC farklı uyarı seviyeleri hakkında uyardı ne, tabii ki, seçimler geliştiriciler tarafından yapılır. Gördüğüm kadarıyla, ilgili tercihlerini imzalı imzasız eşitlik vs daha fazla/daha az karşılaştırmalar mantıklı, bu elbette tamamen öznel

-1 == -1 -1 == (unsigned) -1 - sezgisel bir sonuç bulmak gibi aynı anlamına gelir.

-1 < 2değil-1 < (unsigned) 2 - Bu ilk bakışta daha kolay ve IMO "erken" uyarı. bir hak olarak aynı anlama gelir

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andytokkallos

    Andytokkallo

    27 Kasım 2007
  • MagmaRhino

    MagmaRhino

    16 Temmuz 2011
  • Missouri Star Quilt Company

    Missouri Sta

    18 ŞUBAT 2009