请看一下这个简单的程序:
#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
,所以这是怎么回事?
因为向量的大小是无符号整型。您正在将无符号类型与有符号类型进行比较,并且二进制补码负有符号整数将提升为无符号。这对应于一个大的无符号值。
此代码示例显示的行为与您所看到的相同:
#include <iostream>
int main()
{
std::cout << std::boolalpha;
unsigned int a = 0;
int b = -1;
std::cout << (b < a) << "\n";
}
输出:
假
vector::size()
的签名是:
size_type size() const noexcept;
size_type
是无符号整型。比较无符号整数和有符号整数时,有符号整数将提升为无符号整数。这里, -1
是负数,因此它会翻转,有效地产生 size_type
类型的最大可表示值。因此它会比较大于零。
-1 无符号是一个比零更高的值,因为高位被设置为表示它是负数,但无符号比较使用该位来扩展可表示数字的范围,因此它不再用作符号位。比较结果为
(unsigned int)-1 < 0
,这是错误的。