Let*_*_Be 9 c c++ unsigned signed casting
我到达了需要比较singed和unsigned值的点.到目前为止,我总是修改代码库以完全避免这种情况,但现在我不能这样做.
那么处理烧结和无符号比较的真正正确方法是什么?这是一个混合的C/C++代码库,所以我的问题适用于这两种语言.
我正在检查资源(已签名)与请求的值(未签名).
if (requested > resource.max) return Never;
if (requested > resource.free - resource.assigned) return NotNow;
return Now;
Run Code Online (Sandbox Code Playgroud)
我正在考虑这样的事情(在适用的情况下替换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;
Run Code Online (Sandbox Code Playgroud)
我正确地接近这个,还是有更好的方法?
Ser*_* K. 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) );
}
Run Code Online (Sandbox Code Playgroud)
PS最好尽可能避免混合签名/无符号比较,因为额外的比较和强制转换会导致性能下降.