溢出值在Arduino上打印非溢出值

时间:2018-11-15 15:08:23

标签: c++ arduino arduino-uno

首先,我知道代码的问题以及如何使其工作。我主要是在寻找解释为什么我的输出是原来的。

以下代码复制了该行为:

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位概念

EDIT2

我对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++)仍提供相同的输出。

1 个答案:

答案 0 :(得分:0)

在执行println或值将错误地重载时,编译器可能已将i自动转换为usigned int。尝试使用Serial.println((int)i);