c++ - 为什么#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 的值。
由于它们没有后缀,它们都是int
s,所以溢出是未定义的。
实际上,您的编译器正在做数学模 2^16。
在您的平台上,赔率是 32 位。将 an 附加l
到这些值。Serial
如果只打印int
s ,很有可能仍然无法正确打印该值。(它可能有long
过载)。
另一种可能性是Serial
' 的打印方法是 16 位 int 并且截断在那里进行,但我对此表示怀疑。
推荐阅读
- java - 删除每页第一行的 FixedLeading
- javascript - 其他内容 CSS 之上的导航栏
- sql - 如何在 Oracle 11g 监听器中启用 SSL
- php - 如何有效地制作许多(100 多个)具有细微差异的 HTML 页面
- java - 编译失败:-source 7 中不支持 lambda 表达式
- php - 如何在 php 代码库中停止请求具有 504 超时响应的外部 API
- c# - 错误 System.NullReferenceException:“对象引用未设置为对象的实例。” 在集合视图中(再次)
- c# - System.IO.FileLoadException 如果在设置文件中使用俄语字母
- react-native - 如何在 React Navigation 中使用标题按钮导航到其他页面?
- javascript - 运行 React-DOM 的 JS onLoad