为什么#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 乘法的规则是什么?

回答

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

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

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

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

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

  • 在主机上运行的预处理器很可能使用了更宽的整数。但是当需要该值来为 Arduino 生成代码时,它将值截断为 16 位,因为这就是 Uno 上的“int”。通过将其中一个数字标记为长“24L”,代码生成器应该知道生成更宽的常量值。此页面可能会有所帮助;还查看“长”页面:https://www.arduino.cc/reference/en/language/variables/data-types/int/

以上是为什么#define没有按预期在arduino/c++中乘以数字?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>