Arduino上出现意外的整数数学结果

时间:2013-02-14 09:28:49

标签: arduino

我正在尝试将RGB LED从一种颜色平滑过渡到另一种颜色。作为逻辑的一部分,我有以下函数来确定更改的大小(它乘以因子f以避免浮点数学运算):

int colorDelta(int from, int to, int f) {
  int delta;

  if (to == from) {
    delta = 0;
  } else {
    delta = (to - from) * f;
  }

  return delta;
}

当我致电colorDelta(0, 255, 1000)时,我希望结果为-255000,但该功能会返回7144

我尝试直接执行操作以进行调试,但Serial.print((0 - 255) * 1000, DEC);也将7144写入串口。

我在这里愚蠢地忽略了什么?我真的很想看到(平滑过渡)光。 ;)

1 个答案:

答案 0 :(得分:3)

我怀疑是整数溢出:int类型无法保留-255000。根据语言标准,有符号整数溢出是未定义的行为,但实际上结果的主要部分通常被丢弃(警告:此观察结果不适用于编写代码< / em>,因为未定义的行为仍然未定义;只有当你必须推理关于已知错误的程序时才会出现这种情况。)

快速检查它的好方法是计算实际结果与预期结果之间的差异:-255000 - 7144 = -262144。后者是-(1<<18),这表明我的怀疑是有充分根据的。