来自函数的意外乘法结果

问题描述

我正在编写一段调用函数并传递一个数字

#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>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...