Arduino乘法误差,+ ve * + ve变为-ve

时间:2014-07-14 05:07:00

标签: c arduino avr

我使用模拟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是否存在扰乱传统乘法的问题?

2 个答案:

答案 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