Arduino - 使用for循环编写int数组并不起作用

时间:2017-06-20 20:12:06

标签: arduino

我是一名大学生,所以我还在学习很多东西。我在制作项目时遇到了一些有趣的事情。我有这段代码,当它没有放在for循环中时可以工作,但是当它没有时就不起作用。我只想了解原因。这是我的代码:

void setup() {
  Serial.begin(9600);
  int a[8];
  for(int i=0;i<8;i++) {
    a[i]=pow(2,i);
  }

  for(int i=0;i<8;i++) {
    Serial.print(a[i]);
  }
}

void loop() {
}

以下是没有第一个for循环(数据写入数组)的相同代码:

void setup() {
  Serial.begin(9600);
  int a[8];
  a[0]=pow(2,0);
  a[1]=pow(2,1);
  a[2]=pow(2,2);
  a[3]=pow(2,3);
  a[4]=pow(2,4);
  a[5]=pow(2,5);
  a[6]=pow(2,6);
  a[7]=pow(2,7);
  for(int i=0;i<8;i++) {
    Serial.print(a[i]);
  }
}

void loop() {
}

第一个代码输出:

1
2
3
7
15
31
63
127

第二个代码输出:

1
2
4
8
16
32
64
128

有人知道吗?我真的很想知道原因。

1 个答案:

答案 0 :(得分:6)

您正在经历浮点轮回。 2 ^ 4实际上会给你一个接近15.9999的值,当它被赋值为int时,它会将小数截断为15.我建议在使用2的幂时进行位移操作,这样:

  for(int i=0;i<8;i++)
  {
    a[i]=(1 << i);
  }

如果您想了解位移,请查看here。 如果您想了解有关浮点舍入的更多信息,请查看here

此外,如果您只想快速修复您的代码,我相信这也会有效:

  for(int i=0;i<8;i++)
  {
    a[i]= (int) round( pow(2, i) );
  }

这将在将其转换为int之前正确舍入浮动结果。