[fpc-devel] Unexpected behaviour of bit operators

J. Gareth Moreton gareth at moreton-family.com
Fri May 17 15:44:04 CEST 2019


It's a constant set to equal 2^n, or in binary, 1 followed by n zeroes.

Gareth aka. Kit

P.S. And yes, that mask is also zero-extended to 32-bit or whatever the 
word size is on the CPU.


On 17/05/2019 14:24, wkitty42 at windstream.net wrote:
> On 5/17/19 4:47 AM, Marco Borsari via fpc-devel wrote:
>> In the code below
>>
>> program test;
>> const n=12;
>> s=1 shl n;
>> var a,b,c,h1,h2:word;
>
>
> ummm... what is 's'? you've used it before it has been defined...
>
>
>> begin
>> a:=77;
>> b:=0;
>> (*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);*)
>> writeln(h1,',',h2);
>> end.
>>
>> 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
>>
>
>

---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus




More information about the fpc-devel mailing list