[fpc-pascal] About the bug report #9408...
mm
m2 at ellipsa.net
Wed Aug 15 03:51:47 CEST 2007
Hello,
I don't want to start a big discuss on the subject (it would
presumably lead nowhere) but I would like to answer to both J.M. and
P.V. who added notes to the report.
To J.M.
-------
You said "To be compatible with Delphi". With its current behaviour,
FPC 2.1.4 is not compatible with Delphi (and no more with FPC 2.0.4).
You quoted the bug #8321. There, I see two problems but none concerns
the subtraction of unsigned integers.
1) The problem in the bug report.
"Edit1.text:=(intToStr(a + b - 256));".
Calling an overloaded function with a value whose type is not
clearly defined (a and b are bytes but 256 is not) is, at least,
dangerous programming.
2) The problem in FPC.
For some reasons, FPC decided to call IntToStr(Int64) (here, Delphi
called IntToStr(Longint)). But, instead of extending the parameter as
a signed number, it extended it as an unsigned one. This is not
coherent. Since FPC selected a signed parameter overload, it should
have extended the parameter with
mov eax, param
cdq
not with, as it did,
mov eax, param
mov edx, 0
To P.V.
-------
Compelling FPC 2.1.4 to behave like FPC 2.0.4 is not very difficult.
In a program where you have "A := B - C;" (A,B,C being Longwords), it
is sufficient to write "A := Longword(Longint(B) - Longint(C));" and all
is right. The most difficult is to find which lines of code has to be
modified. FPC signals most of them ("Possible loss of data ...") but not
all. For instance, "if (A and (A-1)) = ..." is silently converted as a
64-bit operation.
But the problem is not just an efficiency problem, it is also a 'result'
problem. For instance, try this with both FPC 2.0.4 and 2.1.4 :
B := 1111;
C := 1112;
D := 311;
A := (B - C) div D;
You will get two different values for A.
With 2.0.4, you compute ((B - C) mod 2^32) div D; with 2.1.4, you
compute (B - C) div D where (B - C) is a 64-bit signed parameter. These
are two different operations.
mm
More information about the fpc-pascal
mailing list