【发布时间】: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