以下代码
#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
}
为什么第二个输出不是-1?第二次cout会发生什么?
答案 0 :(得分:6)
vector::size()
属于size_t
类型,是无符号类型,无符号整数不能代表负数。
答案 1 :(得分:2)
C ++中的无符号整数类型做“环绕算术”a.k.a.时钟算术a.k.a.模运算。任何标准库npm
函数的结果都是无符号的,通常是size
类型。因此,当您从size_t
类型的0中减去1时,您将获得最大的size_t
值。
要避免这些问题,您可以添加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()
并获得有符号整数结果,并在从0减去1时获得n_items( v )
。
答案 2 :(得分:1)
输出会自动转换为size_t
,因为这是value.size()
的返回类型,即unsigned
类型。因此,您会看到打印出unsigned
值。
答案 3 :(得分:1)
.size()会返回一个&#39; size_t&#39;类型是unsigned int。第二个输出是机器的最大整数。
答案 4 :(得分:0)
value.size()返回一个无符号类型,因此通过执行-1实际上是在执行溢出