减去无符号整数的有符号结果
Signed result of subtracted unsigned integers?
我正在尝试创建一个类似于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
代表一个32位无符号整数,而difference_type
代表一个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);
}
标准库的实际实现可能并不一定需要这样做,因为它们通常针对特定的编译器,并且可以使用编译器如何处理实现定义的行为的内部知识,例如在有符号范围之外将无符号值转换为有符号类型的结果。
- 是否可以将无符号 int 的最大值转换为 int 并将结果转换为 -1?
- AVX2 整数乘以有符号 8 位元素,产生有符号 16 位结果?
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- C++,概念不适用于无符号整数作为结果类型?
- 将零附加到数字时,无符号数字会显示不同的结果
- 使用 boost 解析符号链接时,结果不等于原始路径名
- 用有符号长整型结果减去无符号长整型
- 如何正确地将无符号字符转换为CString,并再次将CString的结果反向转换为无符号字符
- 错误 C4146:一元减号运算符应用于无符号类型,结果仍然无符号
- 链接两个具有相同函数签名的强函数符号的结果使用 G++ 以及原因
- 将2^31赋给有符号和无符号的32位整数变量后的奇怪结果
- 无符号值之间的减法-意外结果
- 溢出的有符号/无符号赋值及其结果
- C++中的右移产生异常结果(无符号64位)
- 为什么无符号字符的结果<<无符号字符不是无符号字符
- 是对定义良好的有符号整型进行位操作的结果
- 试图在Mac上使用Eclipse编译OpenAL,结果在符号(s)中找不到架构x86_64错误
- 对于无符号字符,boost::lexical_cast 和 std::to_string 的正确结果是什么
- 减去无符号整数的有符号结果
- 比较8位不同符号类型(int8_t, uint8_t):是结果确定性的