1. ホーム
  2. c++

[解決済み】警告 - 符号付き整数式と符号なし整数式の比較

2022-01-28 09:17:27

質問

現在、私は アクセラレイテッド C++ で、演習2-3で問題に遭遇しました。

プログラムの簡単な概要 - このプログラムは基本的に名前を受け取り、アスタリスクの枠の中に挨拶文を表示するものです。

エクササイズ - サンプルプログラムでは、著者は const int で、挨拶文とアスタリスクの間のパディング(空白)を決めている。そして、読者に演習の一環として、パディングの大きさをどの程度にするか、ユーザーに意見を求めるよう求めている。

簡単そうなので、ユーザーに2つの整数( int を保存し、作者が使っていたものを削除して、これらの整数を使うようにプログラムを変更しました。しかし、コンパイル時に次のような警告が出ました。

Exercise2-3.cpp:46: 警告: 符号付き整数式と符号なし整数式の比較

調べてみると、このコードは上記の整数の1つを比較しようとするためであるようです ( int ) を string::size_type でいいんです。しかし、気になったのは、これは整数の1つを unsigned int ? 整数が符号付きか符号なしかを明示することは重要ですか?

 cout << "Please enter the size of the frame between top and bottom you would like ";
 int padtopbottom;
 cin >> padtopbottom;

 cout << "Please enter size of the frame from each side you would like: ";
 unsigned int padsides; 
 cin >> padsides;

 string::size_type c = 0; // definition of c in the program
 if (r == padtopbottom + 1 && c == padsides + 1) { // where the error occurs

上記は、関連するコードのビットである cstring::size_type というのも、挨拶文の長さがわからないからです。 const int ? また アクセラレイテッド C++ - は、この本の後半で説明されるのでしょうか?

私はLinux MintでGeany経由でg++を使用しています。 string::size_type があります)。

解決方法は?

通常、変数を unsigned または size_t と比較される場合、この問題を回避することができます。 可能な限り、比較する型と同じものを使用します。 std::string::size_type と比較する場合 std::string の長さ)。

符号付きint型と符号なしint型は範囲が異なるため、比較すると意外な結果になることがあるため、コンパイラは符号付きと符号なしの比較について警告を出します。 このような比較をする必要がある場合は、明示的に値の一方を他方と互換性のある型に変換し、変換が有効であることを確認した上で行う必要があります。 例えば

unsigned u = GetSomeUnsignedValue();
int i = GetSomeSignedValue();

if (i >= 0)
{
    // i is nonnegative, so it is safe to cast to unsigned value
    if ((unsigned)i >= u)
        iIsGreaterThanOrEqualToU();
    else
        iIsLessThanU();
}
else
{
    iIsNegative();
}