问题描述
#pragma GCC optimize("Os")
unsigned long getVal(unsigned short val) {
return val * 1000 ;
}
void setup() {
Serial.begin(9600) ;
}
void loop() {
Serial.println(getVal(200)) ;
}
现在,如果我向 getVal() 发送 200,我应该得到 200000,但它返回 3392!但是如果我像这样修改函数:
unsigned long getVal(unsigned short val) {
return val * 1000000 ;
}
我得到了 200000000 的回报,这是预期的。
我无法将数字乘以 1000,但 100,000 效果很好。
我已经尝试使用 O0 禁用优化,这也不能解决问题。
我不明白发生了什么。我在使用 Arduino Nano。
解决方法
val * 1000000
执行长乘法,因为 (1000000) 项之一是 long
val * 1000
进行 int 乘法,因为这两个项都是 int。 Arduino Nano int 只有 16 位宽,因此结果在变成所需的长返回值之前会被截断。
unsigned long getVal(unsigned short val) {
return val * 1000UL ;
}
就是你要找的。p>