9

我到了需要比较有符号值和无符号值的地步。到目前为止,我总是修改代码库以完全避免这种情况,但现在我不能这样做。

那么处理有符号和无符号比较的真正正确方法是什么?这是一个混合的 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;

我是正确地接近这个,还是有更好的方法?

4

1 回答 1

10

您可以使用此单行代码作为起点来安全地执行此操作:

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

PS尽可能避免混合有符号/无符号比较是一种很好的做法,因为额外的比较和强制转换可能会导致性能损失。

于 2012-07-31T08:27:16.667 回答