以下代码
#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?第二场会发生什么?
vector::size()
是 size_t
类型,它是无符号类型,无符号整数不能表示负数。
C++ 中的无符号整数类型执行“环绕算术”,也就是时钟算术,也就是模算术。并且任何标准库
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.
value.size() 返回一个无符号类型,所以通过执行 -1 你实际上是在溢出
输出会自动转换为
size_t
,因为这是 value.size()
的返回类型,这是一个 unsigned
类型。因此,您会看到打印了一个unsigned
值。
.size()
返回一个 size_t
类型,它是一个 unsigned int
。第二个输出是你机器的最大整数。