为什么#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
附加到这些值。如果只打印 int
s,Serial
很可能仍然无法正确打印值。 (它可能有 long
过载)。
另一种可能是Serial
的打印方法是一个16位的int,截断是在那里进行的,但我对此表示怀疑。
在二进制中 86400000
是 101001001100 101110000000000
。要存储此数字,您需要 32 位。但是你将这个数字存储为 16 位并且你使用 101110000000000
,它是 23552
.
101001001100 101110000000000
101110000000000
在预处理器中尝试将数字相乘时,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
附加到这些值。如果只打印 int
s,Serial
很可能仍然无法正确打印值。 (它可能有 long
过载)。
另一种可能是Serial
的打印方法是一个16位的int,截断是在那里进行的,但我对此表示怀疑。
在二进制中 86400000
是 101001001100 101110000000000
。要存储此数字,您需要 32 位。但是你将这个数字存储为 16 位并且你使用 101110000000000
,它是 23552
.
101001001100 101110000000000
101110000000000