Peter Gerwinski wrote:
function CompNum(var e1, e2: TestType):Integer; Var r : Real; begin r := e1 - e2; CompNum := Round(r); end;
Consider this with "TestType = Byte", then in `CompNum' we are subtracting two `Byte' variables from each other. GPC chooses the result type to be `Byte' again, so the result is never negative.
When I convert them to `Integer' by writing
r:= Integer ( e1 ) - Integer ( e2 );
it works. (First it did not work because of a bug in conversions among integer types, but I could fix this.;-)
However, is this the correct behaviour?
I think it is because...
Or should the result type of a subtraction be the "nearest" signed integer type - `ShortInt' in this example? Then, what to do when subtracting two `LongestCard's, especially in cases like "$FFFFFFFFFFFFFFFF - 2" where the result does not fit in `LongestInt'?
That's the problem. Also, this problem is basically the same as a multiplication of two Integers resulting in a LongInt. GPC (and BP) do not do any automatic conversion there, either.
IOW, the programmer is responsible for chosing the right types and converting when necessary. The best the compiler can do (and will do hopefully soon) is range checking.
-- Frank Heckenbach, Erlangen, Germany heckenb@mi.uni-erlangen.de http://home.pages.de/~fjf/links.htm