c++ 为什么(-1 < a.size())是false,即使std::vector的size是正数?

au9on6nz  于 9个月前  发布在  其他
关注(0)|答案(3)|浏览(117)

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

#include <iostream>
#include <vector>
 
int main() {
    std::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";
}

字符串
程序输出

0
Greater


我感到困惑的是,它输出Greater,尽管-1显然小于0
我知道size成员函数返回一个无符号值,但是-10仍然应用比较,那么这是怎么回事呢?

7gcisfzg

7gcisfzg1#

因为向量的大小是一个无符号整数类型。您正在比较一个无符号类型和一个有符号类型,并且二的补码负有符号整数被提升为无符号。这对应于一个大的无符号值。
此代码示例显示了与您所看到的相同的行为:

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

字符串
产出:

o75abkj4

o75abkj42#

vector::size()的签名是:

size_type size() const noexcept;

字符串
size_type是一个unsigned整数类型。当比较一个unsigned和一个signed整数时,signed整数被提升为unsigned。在这里,-1是负数,所以它翻转,有效地产生size_type类型的最大可表示值。因此它将被比较为大于零。

pdtvr36n

pdtvr36n3#

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

相关问题