arduino bitshift left (<<)

gevorg
Offline
Зарегистрирован: 10.07.2013

Всем привет:

Сталкунлся с косяком.

кусок кода:

for (i=0;i<=31;i++)
    {
    Serial.print(1<<i, BIN);
    Serial.println();  
    }

вывод:

1
10
100
1000
10000
100000
1000000
10000000
100000000
1000000000
10000000000
100000000000
1000000000000
10000000000000
100000000000000
11111111111111111000000000000000
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
 

хотя написано:

variable - (byte, int, long) number_of_bits integer <= 32

т.е. получается после смещения 1 на 15 и более влево результат 0.

Кто нибудь сталкивался с такой проблеммой? как можно ее решить?

Заранее спасибо.

tsostik
Offline
Зарегистрирован: 28.02.2013
for (i=0;i<=31;i++)
{
    Serial.print(1UL<<i, BIN);
    Serial.println();  
}

 

gevorg
Offline
Зарегистрирован: 10.07.2013

Спасибо. неожиданно....:)

step962
Offline
Зарегистрирован: 23.05.2011

Магическое число 15 вам ни о чем не говорит?

Если нет, то попробуйте вот так:

Serial.print((long int)1<<i, BIN);

ЗЫ: Упс, опередили...

step962
Offline
Зарегистрирован: 23.05.2011

gevorg пишет:

Спасибо. неожиданно....:)

Вполне себе ожиданно - микроконтроллеры AVR оперируют в основном байтами и словами. Компиляторы тоже под эти размеры заточены. Хотите большего - применяйте к ним политику кнута, в качестве которого может выступать и приведение типов.

gevorg
Offline
Зарегистрирован: 10.07.2013

Еще раз всем спасибо...я бы еще долго ломал голову..

сначала думал косяк print-а, потом компилятора... вот как бывает когда переносишь код с 32 битного контроллера на 8 битный....