On Feb 2, 2011, at 08:15:40, Michael Hennebry wrote:

> On Wed, 2 Feb 2011, Rick Mann wrote:
> 
>> I was working with some uint32_t variables, using shifts, like this:
>> 
>> uint32_t foo = 0;
>> 
>> for (...)
>> {
>>   uint32_t v = // some value between [0, 31)
>> 
>>   foo |= 1 << v;
>> }
>> 
>> This didn't work correctly for values of v greater than 15 until I changed 
>> the line to:
>> 
>>   foo |= 1UL << v;
>> 
>> From what I understand of C, it should've promoted 1 to long, but maybe it's 
>> a signed-vs-unsigned issue? What's happening on an ATmega644A with this code?
> 
> 'Twas a quiet change.
> the type of x<<y is now the type of x after the usual integer promotions.

So, it looks like this?

        foo = (int) ((long) 1 << v)

BTW, love the .sig!

-- 
Rick


_______________________________________________
AVR-chat mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/avr-chat

Reply via email to