C++ - 负数和正数之间的比较返回 false
C++ - Comparison between negative and positive number returns false
我正在使用 Vector 实现一个队列 C++
我使用变量来跟踪任何插入/删除操作sz
队列中有多少自由元素。
我在比较的实现中遇到了一个问题:
sz < vec.size() - 1
在某个时候,这条线开始返回0
,比较是
-1 < 5
有帮助的一件事是这样做
int vecsz = vec.size() - 1;
int regsz = sz;
if (regsz < vecsz)
{
sz++;
}
尽管它有所帮助,但我仍然不明白为什么。有人可以对此有所了解吗?
队列.h
#include <iostream>
#include <vector>
using namespace std;
template <typename Object>
class queue
{
public:
queue(int s)
: vec(s)
{
sz = s - 1;
}
queue () { }
~queue() { }
/**
* Add element to Q and decrease size
*/
void enque(Object obj)
{
if (sz >= 0) {
vec[sz] = obj;
sz--;
}
}
/**
* Remove element from Q and increase size
*/
Object deque()
{
// grab last element
int last = vec[vec.size() - 1];
// remove last element from array
vec.pop_back();
// insert 0 in the front
vec.insert(vec.begin(), 0);
int vecsz = vec.size() - 1;
int regsz = sz;
// increase size tracking var
if (regsz < vecsz)
{
sz++;
}
return last;
}
void print() {
for (int i = 0; i < vec.size(); ++i) {
cout << "i: " << vec[i] << endl;
}
}
private:
vector<int> vec;
int sz;
};
主要
int main()
{
queue<int> Q(5);
cout << "Empty Q:" << endl;
Q.print();
cout << endl;
Q.enque(1);
Q.enque(2);
Q.enque(3);
cout << "Full Q1:" << endl;
Q.print();
cout << "Deque " << endl;
cout << Q.deque() << " " << Q.deque() << " " << Q.deque() << " " << endl;
cout << Q.deque() << endl;
cout << "Print " << endl;
Q.print();
cout << "Enqueue " << endl;
Q.enque(10);
Q.enque(20);
Q.enque(30);
Q.enque(40);
Q.enque(50);
cout << "nFull Q2:" << endl;
Q.print();
cout << endl;
cout << Q.deque() << endl;
Q.enque(100);
cout << "Full Q3:"; Q.print(); cout << endl;
cout << Q.deque() << endl;
cout << Q.deque() << endl;
cout << Q.deque() << endl;
cout << Q.deque() << endl;
return 0;
}
这就是为什么不要混合有符号和无符号类型很重要的原因。 跟
sz < vec.size() - 1
您正在将有符号整数与无符号整数进行比较。 执行此操作时,编译器会将有符号整数转换为与无符号整数相同的类型。 当你这样做并且有符号整数恰好是负数时,你会得到一个值,它是无符号类型的最大值,减去有符号整数的值 所以
-1 < 5
成为
4294967295 (for 32 bits) or 18446744073709551615 (for 64 bits) < 5
这是错误的。
若要解决此问题,请将sz
设置为无符号类型。
vec.size()
是一个无符号整数。将无符号整数类型与大小相同或更小的有符号整数类型进行比较时,有符号类型将转换为与另一个类型相同的类型。负数不能由无符号类型表示。
通常,由于您观察到的问题,您应该避免将有符号数字与无符号数字进行比较。
相关文章:
- C++ - 负数和正数之间的比较返回 false
- 无法将返回的枚举与枚举进行比较
- 在C++中返回基元类型数组(Java比较)
- 比较 C++ 中的两个数组,并根据元素的匹配或不匹配返回值
- 如何在C++中比较 lambda 函数的返回类型?
- C++函数来返回基于参数的比较器通用映射类型?
- 为什么比较运算符"=="返回"YES"即使两个向量不同?
- 为什么当 std::sort 中的比较函数始终返回 true 时出现运行时错误
- 当参数相等时,为什么必须std :: sort比较函数返回false
- 比较字符总是返回的
- 在比较过程中返回节点信息
- 在C++中返回一个比较的字符指针数组
- 比较/计数非零返回比预期更大的值
- 优先级队列自定义比较器的返回值表示什么
- 常量字符* if() 与 "SRAD" 的比较返回 false
- 与返回 false 的 fmod() 结果进行比较
- C++字符串比较返回0,但布尔值返回false
- C++比较运算符未返回true或false
- 比较函数使用重载运算符返回不正确的结果
- 字符串比较返回值(Is用于对字符进行排序的应用程序?)