c++中string.size()的类型是什么?
What is the type of string.size() in C++?
我有以下代码:
#include<iostream>
#include<string>
int main()
{
std::string s = "458";
std::cout <<s.size()-4;
}
当我运行这个时,我得到42944935或类似的东西。但是当我用以下修改运行它时:
int main()
{
std::string s = "458";
int i = s.size();
std::cout << i -4;
}
我得到-1,这是我在第一个代码中所期望的。有人能解释一下这里发生了什么吗?
由于历史原因,std::string::size()
的返回类型是size_t
,这是一个unsigned类型,足以满足最大可能的数组大小。
using Size = ptrdiff_t; // signed type
template< class Collection >
constexpr auto n_items( Collection const& c )
-> Size
{ return c.size(); }
// Raw array. Using size_t template param for g++ compatibility.
template< class Item, size_t n >
constexpr auto n_items( Item (&)[n] )
-> Size
{ return n; }
这里我使用了n_items
这个名字,因为c++ 17将定义一个通用的size
函数,不幸的是,它返回size_t
(并且混淆了一些大小的概念,也很不幸)。这里不希望出现名称冲突。
如果没有这样的函数可用,则可以将大小表示为std::end
和std::begin
的差值,例如end(s) - begin(s)
。原始指针的差异类型是ptrdiff_t
(有符号),而像std::string::begin()
这样的迭代器的默认差异类型也是ptrdiff_t
,来自std::iterator_traits
。
这是因为size()
函数的返回值是一个无符号值。
当从返回值中减去-4
时,结果变为负值。您需要告诉cout
将值解释为带符号的值(例如,像std::cout <<int(s.size()-4);
或您所说的int i = s.size();
那样转换值),然后您将得到您所期望的。你得到的这个大整数背后的原因是,如果你把 2的补负值的二进制表示解释为正值,它将是一个非常大的整数值。
要了解更多关于 2的补码二进制算法,您可以参考此链接。
相关文章:
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- 如何声明一个标准::提升直方图的向量?提升直方图的类型是什么?
- 类名后跟括号的类型是什么
- std::chrono::duration::count函数的实际结果类型是什么
- c++运算符重载-我实际返回的操作数类型是什么
- 运算符和返回类型是什么意思?
- 指向 2D 数组的指针的类型是什么?
- RSA_verify中预期的数据类型是什么,无法验证从 Java 生成的签名
- 共享_ptr中多功能数组的类型是什么
- 构造函数的类型是什么?
- 字符串中单个字符作为数组的数据类型是什么
- 该结构继承的类型是什么
- 如果我获得Integer和Double的产品,输出的数据类型是什么
- C 中被视为可可的类型是什么
- 当函数采用右值引用时,函数中该变量的类型是什么?
- STD :: SETW,STD :: SETFILL等的真实返回类型是什么?
- 模板类中引用的引用的类型是什么
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 包含通过引用捕获的 lambda 函数的"variable"的类型是什么?
- 通过插座发送的内容的数据类型是什么