İmzalı/imzasız karşılaştırma | Netgez.com
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

  • Rozetked | Обзоры

    Rozetked | Ð

    5 AÄžUSTOS 2011
  • rtisticsdev

    rtisticsdev

    31 Mayıs 2012
  • Video-Tutorials.Net

    Video-Tutori

    15 Mart 2011