C++ C+;中的vector.size()与string.length()相乘时出现了意外的答案+;
考虑一下这个代码C++ C+;中的vector.size()与string.length()相乘时出现了意外的答案+;,c++,string,vector,casting,C++,String,Vector,Casting,考虑一下这个代码 string A("a"); vector<string>B={"a","a"}; cout<<A.length()<<endl;; cout<<B[0].length()<<endl;; cout<<B.size()<<endl; cout<<(A.length()-(B[0].length()*B.size()))<<endl; cout<<(int)(A
string A("a");
vector<string>B={"a","a"};
cout<<A.length()<<endl;;
cout<<B[0].length()<<endl;;
cout<<B.size()<<endl;
cout<<(A.length()-(B[0].length()*B.size()))<<endl;
cout<<(int)(A.length()-(B[0].length()*B.size()))<<endl;
string::length和string::size以字节为单位,vector::size为无符号整数。为什么输出是这样的,18446744073709551615的含义是什么,
的数据类型是什么(A.length()-(B[0].length()*B.size())
,为什么整数转换给出了正确的答案?size\u t严格用于存储显然不能为负的大小和长度。它本质上是无符号的,并且依赖于实现。
您的代码强制大小类型为负值,因此您会看到这个奇怪的数字
正如您正确完成的那样,结果必须转换为可以接受负值的数据类型
运行以下自解释代码:
(这应该会给你同样的结果)
#包括
int main()
{
std::size\u t size=-1;
std::我可以肯定这个问题在SO有多个重复项。一个负数->一个无符号类型会导致一个很大的数字。小心你的数学。不要这样做。如果可能的话,在你需要减去数字时使用有符号类型。强制转换的结果是实现定义的行为。要定义良好,你可以当int p=1
和无符号q=-1
为什么p
1
1
2
18446744073709551615
-1
#include <iostream>
int main()
{
std::size_t size = -1;
std::cout << size;
}