[fpc-pascal] Conversion from C to Pascal - Left bit shift

LacaK lacak at zoznam.sk
Fri Sep 3 10:09:05 CEST 2021


> 
>     Can we say that in Pascal the result of:
>         E1 shl E2
>     is of same type as E1 ?
>     (so if E1 is LongWord then result is LongWord also?)
> 
>     What if there is an expression on left side:
>         (E1*x) shl E2
>     Will E1*x promote to 64 bits (on 64 bit target)?
> 
> 
> See documentation on automatic type conversion (the remarks section 
> below table 3.3): 
> https://www.freepascal.org/docs-html/ref/refsu4.html#x26-26004r3 
> <https://www.freepascal.org/docs-html/ref/refsu4.html#x26-26004r3>
> While this doesn't explicitly mention shift behaviour, it implies that 
> E1 and (E1*x) will be promoted to native sized integer if smaller.  For 
> the first example, if E1 is a longword on a 32 bit machine, the result 
> should also be a longword.
> 

But look at Delphi documentation: 
https://docwiki.embarcadero.com/RADStudio/Sydney/en/Expressions_(Delphi)#Logical_.28Bitwise.29_Operators

"The operations x shl y and x shr y shift the value of x to the left or 
right by y bits, which (if x is an unsigned integer) is equivalent to 
multiplying or dividing x by 2^y; the result is of the same type as x"

My understanding is, that in case:
   E1 shl E2 result is of E1 type (so if E1 is LongWord on 64 bit 
platform result is still LongWord?)

Case
   (E1*x) shl E2 is subject to native integer promotion I guess?

L.


More information about the fpc-pascal mailing list