【发布时间】:2013-02-23 19:39:15
【问题描述】:
我有这个函数可以生成指定数量的所谓“三角形数”。如果我打印出双端队列后缀,数字会增加,向下跳,然后再次增加。随着 i 的上升,三角形的数字永远不会变小,所以一定会发生某种溢出。如果结果溢出,我尝试通过添加行 if(toPush > INT_MAX) return i - 1; 来尝试阻止函数生成更多数字(并返回它生成的数字)来修复它。但是,这不起作用,输出仍然不正确(增加一段时间,跳到较低的数字,然后再次增加)。我添加的行实际上似乎根本没有做任何事情。未达到退货。有谁知道这里发生了什么?
#include <iostream>
#include <deque>
#include <climits>
int generateTriangleNumbers(std::deque<unsigned int> &triangleNumbers, unsigned int generateCount) {
for(unsigned int i = 1; i <= generateCount; i++) {
unsigned int toPush = (i * (i + 1)) / 2;
if(toPush > INT_MAX) return i - 1;
triangleNumbers.push_back(toPush);
}
return generateCount;
}
【问题讨论】:
-
第一个不适用的 i 值是什么?如果您手动进行特定的计算,您会观察到什么?
-
您如何期望任何数字严格大于最大可能数字?
-
您应该检查计算的各个步骤。具体来说,如果溢出发生在
(i * (i + 1)),你以后就无法检测到了。 -
@Mat 我认为作为测试我会检查它是否大于 INT_MAX 但仍使用无符号整数。这样,希望它会在数字增长到可能大于无符号整数的大小之前找出问题。
-
@OliCharlesworth 我将尝试弄清楚它发生在 i 的什么值
标签: c++ integer overflow limit