为什么#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/