如果一个常量大于int所能表示的范围,需要用它作为循环的终止条件怎么处理
如果一个常量大于int所能表示的范围,需要用它作为循环的终止条件怎么办?
程序目的,求两个自然数的最大公约数和最小公倍数。
编译软件:VC++6.0
程序如下:
用了穷举的方法来进行求最大公约数和最小公倍数。但是遇到了这么一个问题,当我输入m=189999,n=89996时,m*n的值为17099150004已经超过了int的取值范围。反编译之后发现了如下图的问题。

edx寄存器是一个双字寄存器,无法存下33位的二进制数。当把17099150004的低32位传给edx后,发现低32位是个负数。导致循环直接跳出。
请问这种情况如何处理?
如何在实际编程中避免这种情况发生?是避免超出数据类型的取数范围还是对应用时的情况进行预估,使用更大的数据类型?
PS:如果我将m*n直接替换为17099150004,反编译后发现

方框中
在对eax进行4字扩展后,为什么要把符号所处的寄存器edx的值与3相比较?
另外0FB397A74是从哪里来的?
------解决思路----------------------
比较大小要从高位比起,这里相当于2的32次方进制的数比较大小,对于17099750004转化成2的32次方进制的数就是
(3,0FB397A74)2^32
所以就是先比高位3,再比低位0FB397A74。
------解决思路----------------------
编写程序的时候, 你就需要考虑到溢出的问题。 不管你使用多大的数据类型,都是需要考虑的。
不然, 你以为“千年虫”是怎么发生的。
程序目的,求两个自然数的最大公约数和最小公倍数。
编译软件:VC++6.0
程序如下:
#include<stdio.h>
#include<math.h>
void main()
{
int m,n,max,min,i;
max=0;
min=0;
scanf("%d%d",&m,&n);
for(i=1;i<=(m>n?n:m);i++)
{
if(m%i==0&&n%i==0)
{
if(max<i)
max=i;
}
}
printf("i=%d\n",i);
for(i=1;i<=m*n;i++)
{
if(i%m==0&&i%n==0)
{
min=i;
break;
}
}
printf("i=%d\n",i);
printf("MAX=%d,MIN=%d\n",max,min);
}
用了穷举的方法来进行求最大公约数和最小公倍数。但是遇到了这么一个问题,当我输入m=189999,n=89996时,m*n的值为17099150004已经超过了int的取值范围。反编译之后发现了如下图的问题。
edx寄存器是一个双字寄存器,无法存下33位的二进制数。当把17099150004的低32位传给edx后,发现低32位是个负数。导致循环直接跳出。
请问这种情况如何处理?
如何在实际编程中避免这种情况发生?是避免超出数据类型的取数范围还是对应用时的情况进行预估,使用更大的数据类型?
PS:如果我将m*n直接替换为17099150004,反编译后发现
方框中
在对eax进行4字扩展后,为什么要把符号所处的寄存器edx的值与3相比较?
另外0FB397A74是从哪里来的?
------解决思路----------------------
比较大小要从高位比起,这里相当于2的32次方进制的数比较大小,对于17099750004转化成2的32次方进制的数就是
(3,0FB397A74)2^32
所以就是先比高位3,再比低位0FB397A74。
------解决思路----------------------
编写程序的时候, 你就需要考虑到溢出的问题。 不管你使用多大的数据类型,都是需要考虑的。
不然, 你以为“千年虫”是怎么发生的。