c++ - 正确处理有符号和无符号值的比较

标签 c++ c casting unsigned signed

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

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

我的做法是否正确,或者是否有更好的方法?

最佳答案

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

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

附言最好尽可能避免混合有符号/无符号比较,因为额外的比较和转换会导致性能损失。

关于c++ - 正确处理有符号和无符号值的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11735928/

相关文章:

将 NULL 强制转换为 C 中的结构指针?

python - Python 中的多线程还是串行处理?

c - 阻塞 UDP 套接字 C

c - gdb 反向调试 avx2

c++ - 转换运算符重载以返回 2-dim 数组以访问外部库

在同一行转换两次

c++ - 在顶点着色器中进行变换时在 OpenGL 中选择对象

c++ - 赋值给 *this 有什么作用 (*this = val)?

c++ - 是否可以使用迭代器创建成员字段的值列表?

c - 如何获取字符串中的特定字符