为什么#define 没有像 arduino/c++ 中预期的那样乘以数字?

Why does #define not multiply numbers as expected in 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 乘法的规则是什么?

您的 int 是一个 16 位整数。如果有符号,一个 16 位整数的值最大为 2^15-1,如果无符号则为 2^16-1。

因为没有后缀,都是int,所以overflow没有定义。

实际上,您的编译器正在对 2^16 进行数学运算。

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

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

在二进制中 86400000101001001100 101110000000000。要存储此数字,您需要 32 位。但是你将这个数字存储为 16 位并且你使用 101110000000000,它是 23552.

101001001100 101110000000000
             101110000000000