Копаем код в оллеdbg - видим умножение происходит со знаком - IMUL.
Проверка с использованием Ассемблера - открываем 35 страницу Зубкова С.В. "Assembler для DOS, Windows и UNIX"
Написано - если происходит переполнение, то флаги OF и CF будут равны "1" проверяется последовательно двумя командами сравнения соответствующих флагов указанных выше
jc и
jo.
Делаем после кода умножение (*z) проверочку с помощью ассемблерной вставочки.
Код:
buff=(FunctionRecurFacktorial(z-1)*z);
_asm
{
jc OverProb;
jmp L1
OverProb:jo OverYES
jmp ExitLabel
OverYES: mov eax,-1
mov zz,-1
ExitLabel:
}
if(zz==0)rez=buff;
else {rez=0;printf("OVERflov");}
Вот полный код программки для вычисления факториала, где задается верхняя граница, код сырой, я баловался с рекурсией
Код:
#include <stdio.h>
//#include<cmath>
main ()
{
unsigned int FaK(int z);
int x,i=-6;
printf("vvedite verch gran:");
scanf("%d",&x);
while (i<=x)
{
printf("%4d! = %d\n",i, FaK(i));
i++;
}
}
unsigned FaK(int z)
{
unsigned int rez=999,zz=0,buff;
if (z<0)
{
printf("ErroR");
rez=-1;
}
if (0==z) rez=1;
if (z>0)
{
buff=(FaK(z-1)*z);
_asm
{
jc Lok;
jmp L1
lok: jo Lok2
jmp L1
Lok2:mov eax,-1
mov zz,-1
L1:
}
if(zz==0)rez=buff;
else {rez=0;printf("OVERflov");}
}
return rez;
}
для
контроля корректности результатов - При вычислении более 12 итераций происходит переполнение