Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 函数的意外乘法结果_Math_Arduino_Arduino Nano - Fatal编程技术网

Math 函数的意外乘法结果

Math 函数的意外乘法结果,math,arduino,arduino-nano,Math,Arduino,Arduino Nano,我正在编写一段代码,它调用一个函数并传递一个

我正在编写一段代码,它调用一个函数并传递一个<2**16的数字。该函数仅返回数字*1000:

#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 ;
}
这就是你要找的