例如
string s1 = "";
string s2 = "a";
打印出
cout << s1.size() - s2.size() << endl;
是18446744073709551615吗?
这里发生了什么?
答案 0 :(得分:3)
std::string::size
返回std::size_t
- 虽然用于此的实际类型是实现定义的,但它保证无符号:
std :: size_t是sizeof运算符
结果的无符号整数类型
结果,减去两个std::size_t
(在这种情况下为0 - 1
)会导致整数下溢,导致结果值从&#34;负&#34;价值到一个非常大的正值。
您获得的值18446744073709551615
与2^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_t
是unsigned 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