(int << ulong) == int ?
Don
nospam at nospam.com
Tue Aug 9 00:32:41 PDT 2011
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...
More information about the Digitalmars-d-learn
mailing list