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

au9on6nz  于 2024-01-09  发布在  其他
关注(0)|答案(3)|浏览(163)

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

  1. #include <iostream>
  2. #include <vector>
  3. int main() {
  4. std::vector<int> a;
  5. std::cout << "vector size " << a.size() << std::endl;
  6. int b = -1;
  7. if (b < a.size())
  8. std::cout << "Less";
  9. else
  10. std::cout << "Greater";
  11. }

字符串
程序输出

  1. 0
  2. Greater


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

7gcisfzg

7gcisfzg1#

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

  1. #include <iostream>
  2. int main()
  3. {
  4. std::cout << std::boolalpha;
  5. unsigned int a = 0;
  6. int b = -1;
  7. std::cout << (b < a) << "\n";
  8. }

字符串
产出:

o75abkj4

o75abkj42#

vector::size()的签名是:

  1. size_type size() const noexcept;

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

pdtvr36n

pdtvr36n3#

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

相关问题