C Arduino乘法错误&x2B;ve*+;ve变成-ve

C Arduino乘法错误&x2B;ve*+;ve变成-ve,c,arduino,avr,C,Arduino,Avr,我正在用一个简单的脚本对不同的平台和语言进行基准测试,该脚本模拟了。在测试过程中,我发现我的arduino被种子447卡住了,在那里int 13121乘以三就得到了-26173 我最初的代码是` //made by Hugo K //jun 13 2014 void setup() { Serial.begin(9600); while (!Serial) { ;//wait for serial to connect } } void loop() {

我正在用一个简单的脚本对不同的平台和语言进行基准测试,该脚本模拟了。在测试过程中,我发现我的arduino被种子447卡住了,在那里int 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);
}`

里面的atmega微控制器有什么问题吗?或者int 13121有什么问题,会打乱传统的乘法吗?

您对int为32位的期望有点错误。用AVR;如果需要32位,请使用
long

因为在这种体系结构中,sizeof(int)==2,所以最大正整数是0x7FFF(32767),而在您的情况下是39363

使用unsigned int将最大值增加到0xFFFF


使用unsigned long-to 0xFFFFFFFF

他需要unsigned long来获得32位,“long”将为他提供31@OlegGryb
long
是32位。。。1个符号位和31个精度位自从他处理正数时,他能得到的“long”的最大值是0x7FFFFFFF,即31位,而在无符号long的情况下,最大值是0xFFFFFFFF(32位)。如果不使用无符号类型,他将丢失一位。如果需要32位,请不要使用
long
。每当您对数据类型有具体要求时,请在声明中明确说明。在这种情况下,请使用
uint32\u t
int32\u t
void setup()
{
 Serial.begin(9600);
 while(!Serial)
 {
 }

}


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

}`