Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.03;
Скачать: CL | DM;

Вниз

проблема с divmod   Найти похожие ветки 

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

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


 
MBo ©   (2004-09-16 12:29) [1]

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

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


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

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


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

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


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

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


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

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

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


 
MBo ©   (2004-09-16 13:40) [6]

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


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

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


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

По-моему здесь первый параметр принимается как 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:52) [9]

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


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

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


 
MBo ©   (2004-09-16 13:54) [11]

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


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

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

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


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

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


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

Дык сделать, как 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.



Страницы: 1 вся ветка

Текущий архив: 2004.10.03;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.023 c
14-1095062030
BiN
2004-09-13 11:53
2004.10.03
Улыбнись


3-1094105109
top
2004-09-02 10:05
2004.10.03
Литература по проектированию баз данных


1-1095322589
New
2004-09-16 12:16
2004.10.03
Из Excel


1-1095332052
l1gic
2004-09-16 14:54
2004.10.03
Настройка MaskEdit


14-1095355650
lipskiy
2004-09-16 21:27
2004.10.03
Можно ли сделать так, чтобы при заходе в локальный сетевой ресурс