为什么是(-1< a.size()) false, even though std::vector's size is positive?

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

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

#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
成员函数返回无符号值,但比较仍然适用于
-1
0
,所以这是怎么回事?

c++ comparison stdvector unsigned size-t
3个回答
11
投票

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

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

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

输出:


4
投票

vector::size()
的签名是:

size_type size() const noexcept;

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


2
投票

-1 无符号是一个比零更高的值,因为高位被设置为表示它是负数,但无符号比较使用该位来扩展可表示数字的范围,因此它不再用作符号位。比较结果为

(unsigned int)-1 < 0
,这是错误的。

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