(int << ulong) == int ?

Jonathan M Davis jmdavisProg at gmx.com
Sun Aug 7 14:13:32 PDT 2011


On Monday 08 August 2011 00:33:31 Dmitry Olshansky wrote:
> Just lost the best part of an hour figuring the cause of this small
> problem, consider:
> 
> void main()
> {
>          uint j = 42;
>          ulong k = 1<<cast(ulong)j;
>          ulong m = 1UL<<j;
>          assert(k == 1024);//both asserts do pass
>          assert(m == (1UL<<42));
> }
> 
> I though left operand should be promoted to the largest integer in shift
> expression, isn't it?

I would not expect that type of integer being used to give the number of bits 
to shift to affect thet type of integer being shifted. It doesn't generally 
make much sense to shift more than the size of the integer type being shifted, 
and that can always fit in a byte. So, why would the type of the integer being 
used to give the number of bits to shift matter? It's like an index. The index 
doesn't affect the type of what's being indexed. It just gives you an index.

You have to deal with integer promotions and all that when doing arithmetic, 
because arithmetic needs to be done with a like number of bits on both sides 
of the operation. But with shifting, all your doing is asking it to shift some 
number of bits. The type which holds the number of bits shouldn't really 
matter. I wouldn't expect _any_ integer promotions to occur in a shift 
expression. If you want to affect what's being shifted, then cast what's being 
shifted.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list