簡體   English   中英

施放ssize_t或size_t

[英]Cast ssize_t or size_t

在我在項目中使用的源文件中, ssize_tsize_t變量之間進行了比較:

ssize_t sst;
size_t st;

if(sst == st){...}

我想擺脫警告:

warning: comparison between signed and unsigned integer expressions

但我不確定,我應該向另一個轉變哪個變量?

if((size_t)sst == st){...}

要么

if(sst == (ssize_t)st){...}

什么是更安全,更好,更清潔? 謝謝

這個問題沒有一個正確的答案。 有幾種可能的答案,取決於您對這些變量可能采用的值的先驗知識。

  • 如果你知道sst是非負的,那么你可以安全地將sstsize_t ,因為這不會改變值(順便說一下,如果你根本沒有sst轉換就會發生這種情況)。

  • 如果sst可能是負數但您知道st將永遠不會大於SSIZE_MAX ,那么您可以安全地將stssize_t ,因為這不會更改該值。

  • 如果sst可能是負數,並且st可能大於SSIZE_MAX ,則兩個SSIZE_MAX都不正確; 任何一個都可能改變該值,導致不正確的比較。 相反, if (sst >= 0 && (size_t)sst == st)

如果您不確定前兩種情況之一是否適用,請選擇第三種選項,因為它在所有情況下都是正確的。

只要兩個值都適合ssize_t的正可表示范圍,兩者都可以正常工作。

如果任何一個值沒有 ,你可能會遇到麻煩 - 在測試相等性之前檢查這些情況:

if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st))
{
  ...
}

(我確信C ++人員會建議你完全避免使用C風格的演員 - 我毫不懷疑有人會發表評論或回答,讓你知道在C ++中這樣做的正確方法。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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