c ++矢量大小。为什么-1大于零

时间:2013-04-27 08:41:56

标签: c++ vector comparison unsigned

请看一下这个简单的程序:

#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.我理解size方法返回无符号值,但比较仍然应用于-1和0。发生什么了?任何人都能解释一下吗?

3 个答案:

答案 0 :(得分:4)

因为向量的大小是无符号整数类型。您正在将无符号类型与带符号类型进行比较,并且正在将二进制补码负有符号整数提升为无符号。这对应于一个大的无符号值。

此代码示例显示了您所看到的相同行为:

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

输出:

  

答案 1 :(得分:2)

vector::size()的签名是:

size_type size() const noexcept;

size_type无符号整数类型。比较无符号整数和有符号整数时,签名整数将提升为无符号整数。这里,-1为负数,因此它会翻转,有效地产生size_type类型的最大可表示值。因此它将比较大于零。

答案 2 :(得分:1)

-1 unsigned是一个高于零的值,因为高位被设置为表示它为负,但无符号比较使用此位来扩展可表示数字的范围,因此它不再用作符号位。比较以(unsigned int)-1 < 0完成,这是错误的。