请看一下这个简单的程序:
#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
仍然应用比较,那么这是怎么回事呢?
3条答案
按热度按时间7gcisfzg1#
因为向量的大小是一个无符号整数类型。您正在比较一个无符号类型和一个有符号类型,并且二的补码负有符号整数被提升为无符号。这对应于一个大的无符号值。
此代码示例显示了与您所看到的相同的行为:
字符串
产出:
假
o75abkj42#
vector::size()
的签名是:字符串
size_type
是一个unsigned整数类型。当比较一个unsigned和一个signed整数时,signed整数被提升为unsigned。在这里,-1
是负数,所以它翻转,有效地产生size_type
类型的最大可表示值。因此它将被比较为大于零。pdtvr36n3#
无符号是一个比零大的值,因为高位被设置为表示它是负的,但是无符号比较使用该位来扩展可表示的数字的范围,因此它不再被用作符号位。该比较是以
(unsigned int)-1 < 0
的形式进行的,这是假的。