2012-07-31 15 views
8

Tek ve işaretsiz değerleri karşılaştırmam gereken bir noktaya geldim. Şimdiye kadar bu durumu tamamen önlemek için kod tabanını her zaman değiştirdim, ama şimdi bunu yapamam.İmzalı ve imzasız değerlerin karşılaştırılmasını doğru şekilde ele alma

Tekli ve imzasız karşılaştırmayı işlemek için doğru yol nedir? Bu karışık bir C/C++ kod tabanıdır, bu yüzden sorum her iki dile de uygulanır.

İstenen değere (imzasız) karşı bir kaynağı (imzalı) kontrol ediyorum.

if (requested > (unsigned)INT_MAX) bail_out(); // assert,abort,throw,return.... 
if ((signed)requested > resource.max) return Never; 
if ((signed)requested > resource.free - resource.assigned) return NotNow; 
return Now; 

bunu doğru yaklaşan muyum, ya da bazı iyi bir yol yoktur:

if (requested > resource.max) return Never; 
if (requested > resource.free - resource.assigned) return NotNow; 
return Now; 

bu (uygun durumlarda varyantları ++ yerine C) gibi bir şey düşünüyordum?

Bir başlangıç ​​noktası olarak bu tek satırlık kodu kullanabilirsiniz
+0

Kaynak numaranız neden ilk etapta imzalanır? –

+1

Kaynak hakkında

+1

Ya da neden imzasız talep edilir, çünkü OP'nin imzalandığı gibi davranmak istediği değerdir. Her neyse, bu yaklaşım benim için iyi görünüyor. Bu tür şeyler çok sıkıcı ve ben imzasız türlerden tamamen uzak durmaya eğilimliyim. – jahhaj

cevap

9

güvenli bir biçimde yapmak:

bool GreaterSignedUnsigned(unsigned int u, signed int i) 
{ 
    // calculate the result of (u > i) 

    // if i is nonnegative it is safe to compare 2 unsigned values, 
    // otherwise unsigned int is always greater 
    return (i < 0) || (u > static_cast<unsigned int>(i)); 
} 

dip not Karıştırılmış imzalı/imzasız karşılaştırmalardan kaçınmak iyi bir uygulamadır çünkü ek karşılaştırma ve bir döküm performans kaybına neden olabilir.

İlgili konular