Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

проблема с divmod [D7, WinXP]


Квэнди ©   (2004-09-16 11:51:00) 

Почему при операции (-25) mod (3) результат равен -1
а при (-25) divmod (3) Ошибка "Integer overflow" ?
и как с этим бороться?


palva   (2004-09-16 15:40:00) [1]

Дык сделать, как MBo предложил:

{$APPTYPE CONSOLE}

procedure DivModI(
  Dividend: Integer; // Делимое
  Divisor: SmallInt; // делитель
  var Result, Remainder: SmallInt // частное и остаток
);
begin
 asm
       PUSH    EBX
       MOV     EBX,EDX
       MOV     EDX,EAX
       SAR     EDX,16
       IDIV    BX
       MOV     EBX,Remainder
       MOV     [ECX],AX
       MOV     [EBX],DX
       POP     EBX
 end;
end;
var
 wQ, wR: smallInt;
begin
 DivModI(-25, 7, wQ, wR); // -3 -4
 Writeln(wQ, ' ', wR)
end.


Чайник   (2004-09-16 14:48:00) [2]

MBo ок, попробую
palva: ну в качестве этих двух цифр может оказаться что угодно : -255 до 255 .. это для расчета оттенков цветов..


palva   (2004-09-16 13:58:00) [3]

(-3) (1) у меня дает переполнение.

А чо делать не знаю. Сначала надо спросить а чо надо?


palva   (2004-09-16 13:54:00) [4]

Выдает ошибку, потому что переполнение. -3 интерпретируется как 2^64 - 3 Частное получается очень большим и не влезает в тип Word.


MBo   (2004-09-16 13:54:00) [5]

>Чайник
сделай функцию с предложенными в  [1] изменениями


Чайник   (2004-09-16 13:52:00) [6]

хм... и чо делать?: )


palva   (2004-09-16 13:50:00) [7]

По-моему здесь первый параметр принимается как Integer, а интерпретируется как Cardinal. Тогда вычисления правильные. Их можно проверить:

{$APPTYPE CONSOLE}
uses math;
var
 i64: Int64;
begin
 i64 := 65535;
 i64 := i64*32768+32768;
 writeln(i64); // 2147483648 А с другой стороны...
 i64 := -2147483648 and $FFFFFFFF;
 writeln(i64); // 2147483648 - то же самое число
end.


Чайник   (2004-09-16 13:48:00) [8]

Уверен, проверь (-3) mod (1) что выдаст....
palva
да, но почему тогда:
var
q,w:word;
begin
divmod (-3,2,q,w);
....
end;
выдает ошибку.... или ето только у меня?


MBo   (2004-09-16 13:40:00) [9]

>Чайник
А ты уверен, что отрицательный остаток- это правильно?


palva   (2004-09-16 13:36:00) [10]

А какой знак остатка должен быть в следующем примере?

{$APPTYPE CONSOLE}
uses math;
var
 wQ, wR: word;
begin
 DivMod(-2147483648, 65535, wQ, wR);
 Writeln(wQ, ' ', wR) // Выдает 32768 32768
end.


Чайник   (2004-09-16 13:20:00) [11]

Palva: да нет, тут тип результатов влияет: тип остатка Word , а остаток в данном случае отрицательный...


Чайник   (2004-09-16 13:18:00) [12]

именно про типы я и говорю... не в курсе почему так? зачем было word делать ?


palva   (2004-09-16 13:14:00) [13]

А что, разве неправильный тип параметров? Первый параметр Integer, второй Word.


MBo   (2004-09-16 12:29:00) [14]

А на тип параметров этой процедуры не обратил внимания?

На первый взгляд, аналог для результатов c типом SmallInt можно сделать, заменив SHR на SAR  и DIV на IDIV.


Наверх

Титульная страница Поиск, карта сайта Написать письмо