首页 > 解决方案 > 为什么#define 不按预期在 arduino/c++ 中相乘?

问题描述

当试图在预处理器中将数字相乘时,Arduino 给了我意想不到的值。

例如

#define msPerDay (24 * 60 * 60 * 1000)
void setup() {
    Serial.begin(9600);
    Serial.println(msPerDay);
}
void loop() {}

这应该输出 86400000 但我得到

23552

在串行监视器中。还

#define msPerDay (60 * 1000)
void setup() {
    Serial.begin(9600);
    Serial.println(msPerDay);
}
void loop() {}

应该输出 60000 而是打印

-5536

为什么这会给我这些意想不到的值,C++ 用于计算#define 乘法的规则是什么?

标签: c++arduinoarduino-ide

解决方案


int是一个 16 位整数。如果有符号,则 16 位整数最多可保存 2^15-1 的值,如果无符号,则最多可保存 2^16-1 的值。

由于它们没有后缀,它们都是ints,所以溢出是未定义的。

实际上,您的编译器正在做数学模 2^16。

在您的平台上,赔率是 32 位。将 an 附加l到这些值。Serial如果只打印ints ,很有可能仍然无法正确打印该值。(它可能有long过载)。

另一种可能性是Serial' 的打印方法是 16 位 int 并且截断在那里进行,但我对此表示怀疑。


推荐阅读