gpt4 book ai didi

c++ - 减去无符号整数的有符号结果?

转载 作者:太空狗 更新时间:2023-10-29 20:02:57 25 4
gpt4 key购买 nike

我正在尝试创建一个类似于 vector<string> 的类和另一个与其迭代器类似的类(纯粹作为 C++ Primer 的练习(感兴趣的练习 14.28))。迭代器类通过 vector<string>::size_type 工作。成员(称为 curr )来表示 vector 的索引。我不想粘贴整个作品,因为它太长了,但在尝试为迭代器定义我自己的减法运算符时,我遇到了某种程度的困惑。最终它应该像减去两个迭代器一样工作,并在必要时产生负值。我有这样定义的函数:

??? operator-(const iterator& lhs, const iterator& rhs){
return (lhs.curr - rhs.curr);
}

或者,我的困惑的另一个版本;

#include <vector>
#include <string>
#include <iostream>

using namespace std;

int main(){

vector<string>::size_type x = 5, y = 3;

??? z = (y-x); //what should ??? be if I want -2?

cout << z;

}

(y-x)-2但当然会回到 4294967294因为它是一个 32 位无符号表达式,所以在将它存储到 z 之前。我不知道如何定义我的返回类型,以便如果 rhs (y) 在序列中比 lhs (x) 更远,则返回正确的负值(存储在 z 中)。

我以为vector<string>::difference_type可能会这样做,但我发现 size_type difference_type 表示 32 位无符号整数表示一个 32 位有符号整数,因此使用有符号整数环绕会出现错误,这是未定义的行为 - 即使在我的计算机上它会产生正确的结果。我可以static_cast一切到long long int并返回 long long int但我觉得这有点过于强行了。

最佳答案

要使用的正确类型确实是 vector<string>::difference_type .您可以像这样轻松实现迭代器减法:

difference_type operator- (const iterator &lhs, const iterator &rhs)
{
if (rhs.curr >= lhs.curr) return static_cast<difference_type>(rhs - lhs);
else return - static_cast<difference_type>(lhs - rhs);
}

标准库的实际实现可能不一定需要这样做,因为它们通常针对特定的编译器,并且可以使用编译器如何处理实现定义的行为的内部知识,例如转换无符号数的结果在有符号范围之外时将值转换为有符号类型。

关于c++ - 减去无符号整数的有符号结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32892475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com