Math 函数的意外乘法结果
我正在编写一段代码,它调用一个函数并传递一个<2**16的数字。该函数仅返回数字*1000:Math 函数的意外乘法结果,math,arduino,arduino-nano,Math,Arduino,Arduino Nano,我正在编写一段代码,它调用一个函数并传递一个
#pragma GCC optimize("Os")
unsigned long getVal(unsigned short val) {
return val * 1000 ;
}
void setup() {
Serial.begin(9600) ;
}
void loop() {
Serial.println(getVal(200)) ;
}
现在,如果我发送200到getVal(),我应该得到200000,但它返回3392!但是如果我这样修改函数:
unsigned long getVal(unsigned short val) {
return val * 1000000 ;
}
我得到了2亿美元的回报,这是意料之中的
我不能把数字乘以1000,但100000就行了
我已经尝试过用O0禁用优化,这也不能解决问题
我不明白发生了什么事。我在Arduino Nano上。
val*1000000
执行长乘法,因为其中一个术语(1000000)是长的
val*1000
执行整数乘法,因为这两个项都是整数。Arduino Nano int仅为16位宽,因此结果在转换为所需的长返回值之前会被截断
unsigned long getVal(unsigned short val) {
return val * 1000UL ;
}
这就是你要找的