【问题标题】:Properly handling the comparison of signed and unsigned values正确处理有符号和无符号值的比较
【发布时间】:2012-07-28 23:20:41
【问题描述】:

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

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

我的方法正确吗,还是有更好的方法?

【问题讨论】:

  • 为什么你的资源计数首先被签名?
  • resource.free < resource.assigned + requested 怎么样?
  • 或者为什么要求未签名,因为这是 OP 似乎希望将其视为已签名的值。无论如何,这种方法对我来说似乎很好。这种东西太乏味了,我倾向于完全避免使用无符号类型。
  • 如果requested 大于INT_MAX 那么它肯定大于resourse.max 所以你可以返回Never。否则,您在这里似乎没有问题:一旦您检查了最高位未设置,则转换为 (signed) 是非常安全的。

标签: c++ c casting unsigned signed


【解决方案1】:

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

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

P.S.最好避免混合有符号/无符号比较,因为额外的比较和强制转换可能会导致性能损失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 2012-09-30
    • 2011-07-21
    • 2015-10-31
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多