首先,我知道代码的问题以及如何使其工作。我主要是在寻找解释为什么我的输出是原来的。
以下代码复制了该行为:
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("start");
for(int i = 0; i < 70000; i++) {
if((i % 2000) == 0)
Serial.println(i);
}
}
显然,for循环将永远运行,因为i
将在32,767处溢出。我希望它会溢出并打印-32000。
Expected| Actually printed
0 | 0
2000 | 2000
4000 | 4000
... | ...
30000 | 30000
32000 | 32000
-32000 | 33536
-30000 | 35536
它看起来像打印实际的迭代,因为如果溢出并计数到-32000,则将有33536个迭代,但是我不知道它如何能够打印33536。
每65536次迭代都会发生同一件事:
95536 | 161072 | 226608 | 292144 | 357680
97536 | 163072 | 228608 | 294144 | 359680
99072 | 164608 | 230144 | 295680 | 361216
101072 | 166608 | 232144 | 297680 | 363216
当我更改循环以在每次迭代中添加10.000并仅每1.000.000打印一次以加快速度时,Arduino崩溃(或至少停止打印)为'2.147.000.000'。这似乎指向svtag **的32位概念
我对2.147.000.000
-检查所做的修改:
void loop() {
Serial.println("start");
for(int i = 0; i < 70000; i+=10000) {
if((i % 1000000) == 0)
Serial.println(i);
}
}
它们以与上一个示例相同的趋势工作,打印0, 1000000, 2000000,...
但是,当我将AVR软件包从1.6.17
更新到最新的1.6.23
时,我只会得到0
。原始示例(% 2000 & i++
)仍提供相同的输出。
答案 0 :(得分:0)
在执行println或值将错误地重载时,编译器可能已将i自动转换为usigned int。尝试使用Serial.println((int)i);