2016-01-10 103 views
1

以下代码矢量大小 - 1当大小在C++

#include <vector> 
#include <iostream> 
using namespace std; 
int main() { 
    vector<int> value; 
    cout << value.size() << endl; // output 0 
    cout << value.size() - 1 << endl; // output 18446744073709551615 
} 

是0为什么第二输出不是-1?第二回合会发生什么?

+1

简单:上溢(下溢)... –

+0

因为它是一个无符号值。 Google食物给你:2的补充。 –

回答

5

vector::size()size_t类型,它是一个无符号类型,无符号整数不能表示负数。

+0

链接到相关问题/回答:http://stackoverflow.com/questions/4849632/vectorintsize-type-in​​-c –

0

value.size()返回一个无符号的类型,所以做你-1实际上是做溢出

1

,因为这是返回类型的value.size(),这是一个unsigned类型的输出自动浇注到size_t。因此你会看到一个unsigned的值。

1

.size()返回一个'size_t'类型,它是一个无符号整数。第二个输出是您机器的最大整数。

1

C++中的无符号整数类型DO “环绕算术”也被称为时钟算术a.k.a.模算术。而任何标准库size函数的结果都是无符号的,通常是size_t。所以,当从size_t类型的0中减去1时,将得到最大的size_t值。

为了避免这些问题,你可以包括<stddef.h>和定义

using Size = ptrdiff_t; 

,并进一步(第二功能这里需要列入<bitset),

template< class Type > 
auto n_items(Type const& o) 
    -> Size 
{ return o.size(); } 

template< Size n > 
auto n_items(std::bitset<n> const& o) 
    -> Size 
{ return o.count(); }  // Corresponds to std::set<int>::size() 

然后,你可以写

n_items(v) 

并得到一个有符号的整数结果,并且-1当你从0中减去1时。