Hi

I'm concerned with using DivMod in cases when Dividend is < 0. DivMod declaration is

procedure DivMod(Dividend: Integer; Divisor: Word; var Result, Remainder: Word);

which means that it doesn't allow for Result and Remainder to be < 0. But when Dividend is < 0, Result and/or Remainder sometimes have to be < 0. For example,

var
  UnsignedDivResult, UnsignedModResult: Word;
  DivResult: SmallInt absolute UnsignedDivResult;
  ModResult: SmallInt absolute UnsignedModResult;
begin
  DivMod(-39, 20, UnsignedDivResult, UnsignedModResult);
end;

gets me UnsignedDivResult = 65535 and UnsignedModResult = 65517. Of course when treating memory as signed values (DivResult and ModResult), I can "decipher" correct values (-1 and -19) but that's obviously unclean. Sure I can also just use "div" and "mod" operators, they always get me correct values, but I understand that doing div and mod separately may be slower than DivMod on some processors.

I know that DivMod arguments have to stay as Word for Delphi compat. But in the light of the above, it seems like a good idea to add overloaded DivMod version that returns Result and Remainder as signed values ?

Michalis
_______________________________________________
fpc-devel maillist  -  fpc-devel@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-devel

Reply via email to