例如
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
)会导致整数下溢,导致结果值回绕-从“负”值到非常大的正值。
您得到的值 18446744073709551615
与 2^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/