четверг, 28 января 2010 г.

Integer overflow в Delphi

   Сегодня при очередном анализе написанного ранее кода столкнулся с проблемой. При запуске программы и нажатии кнопки для обработки данных появилось сообщение Integer overflow.(Рис.1.)


Рис.1.
Я начал перебирать код и нашел место в котором программа выдает данное сообщение.
   Есть функция, которая возвращает посчитанный результат тип которого
real.

function getsigparam(p : PPar; n : integer) : real;
begin
  with p^ do
  case n of
 ...
    2: result := num_ch+1;
    9: result := power_event*(1 shl 16)  * data_ch;   //В этом месте возникает ошибка integer Overflow
...
 else
    result := 0;
 end;
end;
Как я понял при умножении двух переменных integer со смещением и integer результат представляется в integer, только после того преобразуются в real.


Решение данной проблемы простое, и оно мне помогло. Я умножил уравнение на 1.0 после чего ошибка исчезла.
В результате я получил следующий работающий код:

function getsigparam(p : PPar; n : integer) : real;
begin
  with p^ do
  case n of
 ...
    2: result := num_ch+1;
    9: result := 1.0*power_event*(1 shl 16)  * data_ch; 
...
 else
    result := 0;
 end;
end;

1 комментарий:

anton-kolomna комментирует...

Спасибо, данная статья помогла. У меня возникала проблема в ассемблере из-под Delphi. У меня шли 2 раза подряд div. Поэтому и выскакивала данная ошибка. Исправил я ее добавив между ними mul eax,1