[fpc-pascal]I don't understand value typecast

Jonas Maebe jonas at zeus.rug.ac.be
Tue Jul 2 16:11:50 CEST 2002

On zondag, juni 30, 2002, at 11:25 , Luis Del Aguila wrote:

> In the manual explain that the value typecast doesn't work, when the 
> type
> size of the expression and the size of the type cast  not must be the 
> same.
> (page 58. ref.pdf)
> But this program compile.
> Var a:integer;
>       b:char;
>       c:boolean;
>       d:word;
> Begin
>    a:=integer('A');
>    b:=Char(4875);
>    c:=boolean(100);
> End.
> How work the value typecast?

I think the manual is incomplete. For ordinal-to-ordinal type casts 
(integers/chars/booleans/range-types) and possibly also 
ordinal-to-enumerations and vice versa, this same-size requirement 
doesn't exist. In such a case,

a) when going from a smaller signed type to a larger signed type (e.g. 
longint_var := longint(shortint_var)), the effect is the same as when 
you would do a regular assignment (so if shortint_var contains $ff = -1 
above, longintvar will become $ffffffff = -1)
b) when going from a smaller unsigned type to any larger type (e.g. 
longint_var := longint(byte_var)), the value of the smaller type is 
simply zero-extended (so if byte_var contains $ff = 255 above, 
longint_var will become $ff = 255)
c) when going from a larger to a smaller type, you just take the n lower 
bytes of the larger type and copy them into the smaller type, where n = 
the size in bytes of the smaller type.

Char, Boolean and all enumeration types (which don't have an explicit 
lower bound set that's negative) are treated as unsigned.


More information about the fpc-pascal mailing list