2013-04-27 156 views
1

请看看这个简单的程序:C++矢量大小。为什么-1大于零

#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.我明白size方法返回无符号值,但比较仍然适用于-1和0.所以发生了什么?任何人都可以解释吗?

+2

-1无符号大于0的无符号由于高位因为它是负面的。 – 2013-04-27 08:42:42

+1

@JesusRamos - 或者更抽象地说,因为语言定义说不符合无符号类型范围的值被模2^n减少,其中n是用于表示无符号类型的位数。对于补码表示来说,这是目前最常见的积分类型表示,事实上,这是因为高位被设置。但其他表示也是允许的。 – 2013-04-27 11:02:58

回答

4

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

此代码示例说明你看到相同的行为:

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

输出:

1

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

2

签名为vector::size()是:

size_type size() const noexcept; 

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