函数的意外乘法结果
Unexpected Multiplication result from function
我正在编写一段调用函数并传递数字 < 2 ** 16 的代码。该函数仅 returns 数字 * 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,但它 returns 3392!但是如果我这样修改函数:
unsigned long getVal(unsigned short val) {
return val * 1000000 ;
}
我得到了 200000000 的回报,这是预期的。
我无法真正将数字与 1000 相乘,但 100,000 就可以了。
我已经尝试禁用 O0 优化,这也没有解决问题。
我不明白发生了什么。我在 Arduino Nano 上。
val * 1000000
执行长乘法,因为其中一项 (1000000) 是 long
val * 1000
执行整数乘法,因为两项都是整数。 Arduino Nano int 仅为 16 位宽,因此结果在转换为所需的 long return 值之前被截断。
unsigned long getVal(unsigned short val) {
return val * 1000UL ;
}
就是您要找的。
我正在编写一段调用函数并传递数字 < 2 ** 16 的代码。该函数仅 returns 数字 * 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,但它 returns 3392!但是如果我这样修改函数:
unsigned long getVal(unsigned short val) {
return val * 1000000 ;
}
我得到了 200000000 的回报,这是预期的。
我无法真正将数字与 1000 相乘,但 100,000 就可以了。
我已经尝试禁用 O0 优化,这也没有解决问题。
我不明白发生了什么。我在 Arduino Nano 上。
val * 1000000
执行长乘法,因为其中一项 (1000000) 是 long
val * 1000
执行整数乘法,因为两项都是整数。 Arduino Nano int 仅为 16 位宽,因此结果在转换为所需的 long return 值之前被截断。
unsigned long getVal(unsigned short val) {
return val * 1000UL ;
}
就是您要找的。