12

私のプロジェクトで使用しているソース ファイルには、変数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){...}

より安全で、より良く、よりクリーンなものは何ですか? ありがとう

4

2 に答える 2

26

この質問に対する唯一の正解はありません。これらの変数が取る可能性のある値についてアプリオリに知っていることに応じて、いくつかの可能な答えがあります。

  • が負でないことがわかっている場合sstは、安全に にキャストできますsstsize_tこれは、値を変更しないためです (ちなみに、これは、キャストがまったくない場合に起こります)。

  • sstが負の可能性があるが、stが よりも大きくなることはないとわかっている場合は、にSSIZE_MAX安全にキャストできます。これは値を変更しないためです。stssize_t

  • sstが負の可能st性があり、 より大きい可能性がある場合、SSIZE_MAXどちらのキャストも正しくありません。いずれかが値を変更する可能性があり、結果として誤った比較が行われる可能性があります。代わりに、次のようにしますif (sst >= 0 && (size_t)sst == st)

最初の 2 つの状況のいずれかが当てはまると確信できない場合は、3 番目のオプションを選択してください。

于 2013-04-18T15:13:29.877 に答える
3

両方の値が の正の表現可能な範囲に収まる限り、どちらでも問題なく機能しますssize_t

どちらかの値がそうでない場合、問題が発生する可能性があります。等しいかどうかをテストする前に、これらのケースを確認してください。

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

(C++の人々は、Cスタイルのキャストを完全に避けることをお勧めすると確信しています-誰かがコメントまたは回答して、C++でそれを行う正しい方法を教えてくれることは間違いありません。)

于 2013-04-18T15:06:01.407 に答える