2012-07-31 89 views
8

我到達了需要比較有符號和無符號值的點。直到現在,我總是修改代碼庫以完全避免這種情況,但現在我無法做到這一點。正確處理有符號值和無符號值的比較

那麼,處理單個和無符號比較的真正正確方法是什麼?這是一個混合的C/C++代碼庫,所以我的問題適用於這兩種語言。

我正在檢查資源(簽名)與請求值(無符號)。

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

我在想是這樣的(替代C++變種如適用):

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; 

我是不是正確地處理這個,或者是有一些更好的辦法?

+0

爲什麼您的資源數首先簽署? – 2012-07-31 08:23:30

+1

'resource.free 2012-07-31 08:24:16

+1

或者爲什麼要求未簽名,因爲這是OP似乎想要視爲簽名的值。無論如何,這種方法對我來說似乎很好。這種東西太單調乏味,我傾向於完全避免未簽名的類型。 – jahhaj 2012-07-31 08:25:23

回答

9

您可以使用此一班輪代碼爲出發點,以做安全:

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)); 
} 

附:儘可能避免混合簽名/無符號比較是一種很好的做法,因爲額外的比較和演員陣容可能會導致性能下降。