2014-07-14 3 views
1

Я сравниваю различные платформы и языки с простым скриптом, который эмулирует Collatz conjecture. Во время тестирования я обнаружил, что мой arduino застревает на семенах 447, где умножение int 13121 на три урожайности -26173.Ошибка умножения Arduino, + ve * + ve становится -ve

Мой исходный код был `

//made by Hugo K 
//jun 13 2014 




void setup() 
{ 
    Serial.begin(9600); 
    while (!Serial) 
    { 
    ;//wait for serial to connect 
    } 

} 


void loop() 
{ 
    unsigned long starttime; 
    starttime = millis(); 
    for (int i = 1; i <= 500; i++) 
    { 
    int a = i; 
    while (a != 1) 
    { 
     if (a%2 == 0) 
     { 
     a = a/2; 
     } 
     else 
     { 
     a = (a*3) + 1; 
     } 
     //Serial.println(a); 
    } 

    } 
    Serial.println(millis() - starttime); 
}` 

А позже подтвердил`

void setup() 
{ 
Serial.begin(9600); 
while(!Serial) 
{ 
} 

} 


void loop() 
{ 
    int i = 13121; 
    Serial.println(i *3); 

}` 

Есть ли что-то не так с ATmega микроконтроллера там? или есть проблема с int 13121, которая нарушает традиционное умножение?

ответ

0

С вашей точки зрения что-то не так, что int - 32 бит. С AVR, int is only 16 bits; используйте long, если вы хотите 32 бит.

+0

ему нужно беззнаковое долго, чтобы получить 32 бита, «длинный» даст ему 31 –

+0

@OlegGryb 'long' 32 бита ... 1 знаковый бит и 31 бит точности –

+0

, поскольку он имеет дело с положительные числа, только макс, который он может получить для «long», равен 0x7FFFFFFF, который составляет 31 бит, в то время как в случае беззнакового длинного max будет 0xFFFFFFFF (32 бит). Он потеряет один бит, если не использует неподписанные типы. –

1

Поскольку SizeOf (INT) == 2 в этой архитектуре, максимальное положительное число 0x7FFF (32767), в то время как в вашем случае это 39363.

Использование неподписанных Int увеличит ваш максимум до 0xFFFF

Использование неподписанных долго - до 0xFFFFFFFF

Смежные вопросы