(int << ulong) == int ?
Jonathan M Davis
jmdavisProg at gmx.com
Tue Aug 9 00:48:56 PDT 2011
On Tuesday 09 August 2011 09:32:41 Don wrote:
> Jonathan M Davis wrote:
> > 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.
>
> Your intuition is wrong!
>
> expression.html explicitly states the operands to shifts undergo
> integral promotions. But they don't get arithmetic conversions.
>
> I think this is terrible.
>
> short x = -1;
> x >>>= 1;
>
> Guess what x is...
That's just downright weird. Why would any integral promotions occur with a
shift? And given your example, the current behavior seems like a bad design.
Is this some weird hold-over from C/C++?
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list