正确处理有符号值和无符号值的比较
问题描述:
我到达了需要比较有符号和无符号值的点。直到现在,我总是修改代码库以完全避免这种情况,但现在我无法做到这一点。正确处理有符号值和无符号值的比较
那么,处理单个和无符号比较的真正正确方法是什么?这是一个混合的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));
}
附:尽可能避免混合签名/无符号比较是一种很好的做法,因为额外的比较和演员阵容可能会导致性能下降。
为什么您的资源数首先签署? – 2012-07-31 08:23:30
'resource.free
2012-07-31 08:24:16
或者为什么要求未签名,因为这是OP似乎想要视为签名的值。无论如何,这种方法对我来说似乎很好。这种东西太单调乏味,我倾向于完全避免未签名的类型。 – jahhaj 2012-07-31 08:25:23