1

我正在尝试将 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串行端口。

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

4

1 回答 1

3

我怀疑整数溢出:该int类型无法容纳-255000。按照语言标准,有符号整数溢出是未定义的行为,但实际上结果的主要位通常只是被丢弃(警告:此观察不打算用于编写代码,因为未定义的行为仍然未定义;它仅适用于那些当您必须对已知错误的程序进行推理时)。

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

于 2013-02-14T09:49:59.597 回答