簡體   English   中英

正確處理有符號和無符號值的比較

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM