我使用模拟Collatz conjecture的简单脚本对不同平台和语言进行基准测试。在测试过程中,我发现我的arduino卡在种子447上,其中13121乘以三个产量-26173。
我的初始代码是`
//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 :(得分:1)
由于此体系结构中的sizeof(int)== 2,因此最大正整数为0x7FFF(32,767),而在您的情况下为39363。
使用unsigned int会将最大值增加到0xFFFF
使用无符号长 - 到0xFFFFFFFF
答案 1 :(得分:0)
您的期望int
是32位有问题。使用AVR,int
is only 16 bits;如果你想要32位,请使用long
。