c++ - 溢出值在 Arduino 上打印非溢出值

标签 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-check 所做的编辑:

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++) 仍然给出相同的输出。

最佳答案

当您执行 println 时,编译器可能会自动将 i 转换为 unsigned int,或者该值将被错误重载。尝试使用 Serial.println((int)i);

关于c++ - 溢出值在 Arduino 上打印非溢出值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53322390/

相关文章:

c++ - 处理 Eigen 中两种存储布局的固定大小矩阵的连续 vector

c++ - 多次实现成员功能

c++ - 如何将 const char* 转换为 char[256]

java - Java 中的 Arduino Map 等效函数

arduino - Mac + Uno + avrdude : stk500_recv(): programmer is not responding

debugging - 当前不会命中断点。无法在目标上设置请求的断点

c++ - 理解 OpenCV 的 undistort 函数

c++ - 2wd 蓝牙控制汽车无法停止的问题

android - Arduino安卓蓝牙通讯

Qt 没有从 arduino 接收串行数据