2012-07-31 95 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)); 
} 

附:尽可能避免混合签名/无符号比较是一种很好的做法,因为额外的比较和演员阵容可能会导致性能下降。