整数溢出的奇怪行为



我创建了以下代码来查找硬币问题的答案。这涉及到找到给定k个面额的硬币的最小数量(其中每个这样的硬币无限供应(以形成目标和n。特别地,我研究了k=5,面额={2,3,4,5,6}和目标和n=100的情况。

代码

#include<iostream>
#include<algorithm>
using namespace std;
int coins[5] = {2,3,4,5,6};
int values[101];
int n=100;
int k=5;
int INF = INT_MAX;
int main()
{
for (int x=1;x<=n;x++)
{
values[x] = INF;
for (int j=1;j<=k;j++)
{
if (x-coins[j-1]>=0)
{
values[x] = min(values[x],values[x-coins[j-1]]+1);
}
}
}
cout<<values[100];
return 0;
}

我收到的这个代码的输出是-2147483632。很明显,一定发生了某种溢出,所以我决定输出INF+1。我得到了INT_MIN作为答案。但我也记得,当输出一些超出int范围的数字时,通常不会出现这样的问题。

我决定输出1e11,令我惊讶的是,答案仍然是1e11。为什么会发生这种情况,请帮忙。

此处:

values[x] = min(values[x],values[x-coins[j-1]]+1);

例如,对于x=3coins[0]=2,可以添加values[1] + 1

然而,values[1] = INT_MAX。然后,在执行此计算时会得到一个未定义的行为。

您可以使用INF = INT_MAX - 1;解决问题

如果您的程序对有符号整数执行算术运算,产生的结果超出了可表示值的范围,即如果此类运算溢出,例如在INT_MAX + 1的情况下,则程序的行为是未定义的。

我决定输出1e11,令我惊讶的是,答案仍然是1e11。

1e11是一个浮点文字。浮点类型具有与int不同的可表示值范围,以及关于溢出的不同要求。

相关内容

  • 没有找到相关文章