diff --git a/UBigInt.pas b/UBigInt.pas index 74dc5fa..a49ea16 100644 --- a/UBigInt.pas +++ b/UBigInt.pas @@ -161,7 +161,7 @@ end; class function TBigInt.AddAbsoluteValues(constref AA, AB: TBigInt; const AReturnNegative: Boolean): TBigInt; var - i, lenA, lenB, len, shorter: Integer; + i, j, lenA, lenB, len, shorter: Integer; carry: Cardinal; begin lenA := Length(AA.FDigits); @@ -208,9 +208,11 @@ begin // carry-overs. This avoids additional tests for finding the shorter digit array. if (i < lenA) or (i < lenB) then if lenA >= lenB then - Move(AA.FDigits[i], Result.FDigits[i], CDigitSize * (len - i)) + for j := i to len - 1 do + Result.FDigits[j] := AA.FDigits[j] else - Move(AB.FDigits[i], Result.FDigits[i], CDigitSize * (len - i)); + for j := i to len - 1 do + Result.FDigits[j] := AB.FDigits[j]; // Applies the remaining carry-overs until the end of the prepared result digit array. while (carry > 0) and (i < len) do @@ -235,7 +237,7 @@ class function TBigInt.SubtractAbsoluteValues(constref AA, AB: TBigInt; const AR var a, b: TBigInt; carry: Cardinal; - i, lastNonZeroDigitIndex, len: Integer; + i, j, lastNonZeroDigitIndex, len: Integer; begin // Establishes the operand order, such that Abs(a) is not less than Abs(b). if (AA.CompareToAbsoluteValues(AB) >= 0) then @@ -300,7 +302,8 @@ begin // Copies the missing unchanged digits from the longer operand to the result, if any. If there are none, then no trim // needs to occur because the most significant digit is not zero. if i < len then - Move(a.FDigits[i], Result.FDigits[i], CDigitSize * (len - i)) + for j := i to len - 1 do + Result.FDigits[j] := a.FDigits[j] else if (lastNonZeroDigitIndex + 1 < len) then // Trims leading zeros from the digits array. Delete(Result.FDigits, lastNonZeroDigitIndex + 1, len - lastNonZeroDigitIndex - 1); @@ -605,7 +608,10 @@ begin // Performs full digit shifts by copy if there are no bit shifts. len := Length(A.FDigits); SetLength(Result.FDigits, len + digitShifts); - Move(A.FDigits[0], Result.FDigits[digitShifts], CDigitSize * len); + for i := 0 to digitShifts - 1 do + Result.FDigits[i] := 0; + for i := 0 to len - 1 do + Result.FDigits[i + digitShifts] := A.FDigits[i]; end; Result.FIsNegative := A.IsNegative;