两个字符串大小的差异

difference of two string size

本文关键字:字符串 两个      更新时间:2023-10-16

例如

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

打印输出

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

是18446744073709551615吗?

这是怎么回事?

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

std::size_t 是 sizeof 运算符的结果的无符号整数类型

因此,减去两个std::size_t(在这种情况下为0 - 1(会导致整数下溢,导致结果值从"负"值变为非常大的正值。


您得到的值18446744073709551615 ,与 2^64 - 1(在 64 位整数下溢出后-1(相同,这与上述一致。


要"修复"此问题(即获取-1而不是下溢值(,您需要在执行减法之前将值转换为有符号类型。但是,正如您从这篇文章中看到的那样,没有保证足够大的签名类型。我们可以凑合着用long long

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

std::string::size的返回类型是 size_tsize_t是无符号整数类型,因此,size_t(0) - size_t(1) 操作将导致整数下溢。

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

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

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

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

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

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

264 - 1 = 18446744073709551615