gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:36:28 26 4
gpt4 key购买 nike

在预处理器中尝试将数字相乘时,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 附加到这些值。如果 Serial 只打印 int,它很可能仍然无法正确打印值。 (它可能有一个 long 重载)。

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

关于c++ - 为什么#define 没有像 arduino/c++ 中预期的那样乘以数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68873605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com