-1

我正在编写一段代码,它调用一个函数并传递一个数字 < 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)) ;
}

现在,如果我向 getVal() 发送 200,我应该得到 200000,但它返回 3392!但是如果我像这样修改函数:

unsigned long getVal(unsigned short val) {
    return val * 1000000 ;
}

我得到了 200000000 回来,这是预期的。

我不能将数字与 1000 相乘,但 100,000 就可以了。

我已经尝试使用 O0 禁用优化,这也不能解决问题。

我不明白发生了什么。我在 Arduino Nano 上。

4

1 回答 1

1

val * 1000000执行长乘法,因为其中一项 (1000000) 是long

val * 1000进行 int 乘法,因为这两个项都是 int。Arduino Nano int 仅 16 位宽,因此结果在转换为所需的长返回值之前被截断。

unsigned long getVal(unsigned short val) {
    return val * 1000UL ;
}

就是你要找的。

于 2021-04-25T17:33:45.090 回答