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

问题描述 投票:2回答:3

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

#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。所以这是怎么回事上?有人可以解释吗?

c++ vector comparison unsigned
3个回答
5
投票

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

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

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

输出:

false


3
投票

vector::size()的签名是:

size_type size() const noexcept;

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.