[fpc-devel] Unexpected behaviour of bit operators

Marco Borsari borsa77 at libero.it
Fri May 17 10:47:20 CEST 2019

In the code below

program test;
const n=12;
s=1 shl n;
var a,b,c,h1,h2:word;
(*c:=(a XOR b)*(a SHL 5+b SHR 2);*)
h1:=((a XOR b)*(a SHL 5+b SHR 2)) SHR (16-n);
(*h1:=c SHR (16-n);*)
h2:=((a XOR b)*(a SHL 5+b SHR 2)) AND ((s-1) SHL (16-n)) SHR (16-n);
(*h2:=c AND ((s-1) SHL (16-n)) SHR (16-n);*)

the results of h1 and h2 (they are hashes) are different, and only h2
appears to be correct and inside the range.
If we precompute the hash value with c, then both h1 and h2 are
the same.
Does this is an effect of some multiplication overflow,
or is it a bug?

Regards, Marco Borsari
Simplex sigillum veri

More information about the fpc-devel mailing list