C++ 矢量大小。为什么 -1 大于零

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

提问人:Andrey Chernukha 提问时间:4/27/2013 最后编辑:ChrisMMAndrey Chernukha 更新时间:9/5/2023 访问量:4055

问:

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

#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。我知道该方法返回无符号值,但比较仍适用于 -1 和 0。那么这是怎么回事呢?谁能解释一下?size

C++ 向量 比较 unsigned

评论

2赞 Jesus Ramos 4/27/2013
-1 unsigned 大于 0 unsign,因为它设置为负数,因此设置了高位。
1赞 Pete Becker 4/27/2013
@JesusRamos - 或者更抽象地说,因为语言定义说,不适合无符号类型范围的值是约模 2^n,其中 n 是用于表示无符号类型的位数。对于二元补码表示,这是当今整数类型最常见的表示,事实上,这是因为设置了高位。但其他表示也是允许的。
0赞 Asteroids With Wings 3/10/2020
这甚至不是关于“抽象”;这些是语言的规则。C++ 不处理“高位”;它处理合同。

答:

2赞 Jesus Ramos 4/27/2013 #1

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

评论

0赞 Asteroids With Wings 3/10/2020
这与“高位”无关。这是关于规则的。规则是 -1 转换为无符号 int 环绕到无符号 int 范围的顶部。按位表示的相关性再低不过了,尽管它恰好在许多系统上匹配。
4赞 user529758 4/27/2013 #2

签名为:vector::size()

size_type size() const noexcept;

size_type无符号整数类型。比较无符号整数和有符号整数时,有符号整数将提升为无符号整数。此处为 negative,因此它会滚动,从而有效地生成该类型的最大可表示值。因此,它将比较为大于零。-1size_type

10赞 juanchopanza 4/27/2013 #3

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

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

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

输出: