(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