c++ - 两个字符串大小的差异

标签 c++ c++11

例如

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

打印出来

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

是 18446744073709551615 吗?

这里发生了什么?

最佳答案

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

std::size_t is the unsigned integer type of the result of the sizeof operator

因此,减去两个 std::size_t(在本例中为 0 - 1)会导致整数下溢,导致结果值回绕-从“负”值到非常大的正值。


您得到的值 184467440737095516152^64 - 1 相同(在 64 位上发生下溢后为 -1位整数), 符合上述。


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

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

关于c++ - 两个字符串大小的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48218098/

相关文章:

c++ - 64 位 Windows API 结构对齐导致命名管道上的访问被拒绝错误

c++ - 递归 Variadic 模板函数的编译错误

c++ - 如何检查在编译时是否调用了模板化方法?

c++ - 将 Boost Python 与 Weak Ptr 一起使用?

c++ - 修改 c 字符串

c++ - 在 Eclipse CDT 中读取/写入文件的目录有问题

c++ - 范围 For 循环帮助 : Expected initializer before ":" token

java - 并发 C++ 程序中的可见性

c++11 - 使 std::initializer_list const 改变什么?

c++ - 枚举的 std::unordered_set,调用 find 给出段错误