[英]Properly handling the comparison of signed and unsigned values
我到達了需要比較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) );
}
PS最好盡可能避免混合簽名/無符號比較,因為額外的比較和強制轉換會導致性能下降。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.