c++向量大小.为什么-1大于零

c++ vector size. why -1 is greater than zero

本文关键字:大于 为什么 向量 c++      更新时间:2023-10-16

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

#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。那到底发生了什么?有人能解释一下吗?

因为向量的大小是无符号整数类型。您正在比较一个无符号类型和一个有符号类型,而这两个类型的补码负符号整数正被提升为无符号。对应于一个大的无符号值。

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

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

输出:

错误

vector::size()的签名是:

size_type size() const noexcept;

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

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