Arduino中整数相乘得到错误结果的问题排查
解决电位器读数乘180后输出负数的问题
问题原因
Arduino 默认的 int 是16位有符号整数,最大值为32767。而电位器的最大模拟读数是1023,1023 × 180 = 184140,这个数值远超出16位int的范围,触发了整数溢出——有符号整数溢出后会绕回负数区间,这就是你看到负数输出的原因。
解决方案
改用更大范围的数据类型(比如long)进行计算,在乘法运算前先将val转换为长整型,避免溢出:
修改后的代码:
#define POTENTIOMETER_PIN A0 int val; void setup() { Serial.begin(9600); } void loop() { val = analogRead(POTENTIOMETER_PIN); // 先将val转为long类型再执行乘法,避免溢出 Serial.println((long)val * 180); delay(250); }
如果后续需要计算角度(即除以量程1023),同样要保证计算过程中不会溢出,正确写法如下:
Serial.println((long)val * 180 / 1023);
原理说明
long是32位有符号整数,最大值为2147483647,完全可以容纳1023×180的结果,因此不会出现溢出问题,输出结果会符合预期的0~184140区间。
内容的提问来源于stack exchange,提问作者Fadi EID
相关产品推荐
相关产品推荐

