5

次の簡単なプログラムを見てください。

#include <iostream>
#include <vector>

using namespace std;

int main() {

vector<int> a;

std::cout << "vector size " << a.size() << std::endl;

int b = -1;

if (b < a.size())
   std::cout << "Less";
else
   std::cout << "Greater";

    return 0;
}

-1 が 0 未満であることは明らかですが、「Greater」を出力するという事実に混乱しています。sizeメソッドが符号なしの値を返すことは理解していますが、比較は -1 と 0 に適用されます。誰でもこれを説明できますか?

4

3 に答える 3

8

ベクトルのサイズは符号なし整数型であるためです。符号なしの型を符号付きの型と比較しており、2 の補数の負の符号付き整数が符号なしに昇格されています。これは、大きな符号なし値に対応します。

このコード サンプルは、表示されているのと同じ動作を示しています。

#include <iostream>
int main()
{
  std::cout << std::boolalpha;
  unsigned int a = 0;
  int b = -1;
  std::cout << (b < a) << "\n"; 
}

出力:

間違い

于 2013-04-27T08:45:14.900 に答える
4

の署名vector::size()は次のとおりです。

size_type size() const noexcept;

size_type符号なし整数型です。符号なし整数と符号付き整数を比較すると、符号付きの整数が符号なしに昇格されます。ここで、-1は負であるためロールオーバーし、そのsize_type型の表現可能な最大値を効果的に生成します。したがって、ゼロより大きいものとして比較されます。

于 2013-04-27T08:44:47.550 に答える
2

-1 符号なしはゼロよりも高い値です。これは、上位ビットが負であることを示すように設定されているためですが、符号なし比較ではこのビットを使用して表現可能な数値の範囲を拡大するため、符号ビットとしては使用されなくなります。比較は、(unsigned int)-1 < 0どちらが false であるかとして行われます。

于 2013-04-27T08:44:07.623 に答える