我正在尝试将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
写入串口。
我在这里愚蠢地忽略了什么?我真的很想看到(平滑过渡)光。 ;)
答案 0 :(得分:3)
我怀疑是整数溢出:int
类型无法保留-255000。根据语言标准,有符号整数溢出是未定义的行为,但实际上结果的主要部分通常被丢弃(警告:此观察结果不适用于编写代码< / em>,因为未定义的行为仍然未定义;只有当你必须推理关于已知错误的程序时才会出现这种情况。)
快速检查它的好方法是计算实际结果与预期结果之间的差异:-255000 - 7144 = -262144
。后者是-(1<<18)
,这表明我的怀疑是有充分根据的。