İ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
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 < 2
değil-1 < (unsigned) 2
- Bu ilk bakışta daha kolay ve IMO "erken" uyarı. bir hak olarak aynı anlama gelir
Neden imzasız taşma tanımlanan davranı...
C imzalı imzasız dönüşüm - her zaman g...
Char imzalı veya imzasız varsayılan ol...
Verimli imzasız-imzalı döküm kaçınarak...
C çeteleler imzalı ya da imzasız....