两个字符串大小的差异
difference of two string size
例如
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_t
。 size_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
相关文章:
- 两个字符串在 c++ 中不相等
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 将字符串拆分为标记,并将标记拆分为两个单独的数组
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 比较两个字符串后卡在无限循环中
- 我已经建立了递归关系,它找到了两个字符串之间最长的连续公共字符串,我怎么能跳过其中一个字符串中的一个字符
- 使用XOR查找O(n)-解决方案中的两个字符串是否为变位符
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- 如何将两个字符串加在一起,就好像它们是变量一样?
- 我需要帮助在一个类中输入两个字符串并获取其输出
- 这两个C++语句连接字符串有什么区别?
- 两个字符串之间的数学运算
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- 有没有办法我可以在 C++ 中使用 if 语句来说明如果一个字符串不是两个名称的 eqal,它会给出一个输出,ATM i
- 如何在 main 函数中输出两个新字符串C++?
- sscanf() 有两个字符串参数
- 我的字符串数组一次打印出前两个字符串
- 两个 c++ 字符串上的异或
- 函数返回两个字符串的第一个常用字符
- 目标是找到两个 c 字符串之间的公共前缀(必须使用特定的函数标头)