两个字符串大小的差异

时间:2018-01-12 00:58:09

标签: c++ c++11

例如

string s1 = "";
string s2 = "a";

打印出

cout << s1.size() - s2.size() << endl;

是18446744073709551615吗?

这里发生了什么?

3 个答案:

答案 0 :(得分:3)

std::string::size返回std::size_t - 虽然用于此的实际类型是实现定义的,但它保证无符号

  

std :: size_t是sizeof运算符

结果的无符号整数类型

结果,减去两个std::size_t(在这种情况下为0 - 1)会导致整数下溢,导致结果值从&#34;负&#34;价值到一个非常大的正值。

您获得的值184467440737095516152^64 - 1(在64位整数下溢后为-1)相同,这符合上述要求。 / p>

To&#34; fix&#34;这个(即得到-1而不是下溢值),在进行减法之前,您需要将值转换为有符号的类型。但是,正如您从this post所看到的那样,没有签名类型可以保证足够大。我们可以使用long long

long long diff = static_cast<long long>(s1.size()) - static_cast<long long>(s2.size());

答案 1 :(得分:1)

std::string::size is size_t的返回类型。 size_tunsigned integer type,因此size_t(0) - size_t(1)的操作会导致整数下溢。

如果您确实需要执行此操作,则可以将size的结果转换为有符号整数类型以进行计算:

cout << static_cast<long int>(s1.size()) - static_cast<long int>(s2.size()) << endl;

答案 2 :(得分:0)

string::size返回size_t - 即size_t是无符号类型。所以它只能存储正数。

因此-1转换为无符号数。

根据标准,无符号数量的负数是通过从2 n 中减去其值来计算的,其中n是提升操作数中的位数。

在您的系统上,size_t是64位无符号类型,因此n为64。 所以打印的是

2 64 - 1 = 18446744073709551615