time - 在 Arduino 中数数是胡说八道的数字
问题描述
我想将输入的时间日期转换为秒。
case 1:
lcd.setCursor(0, 0);
lcd.print("Nastavte zacatek");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("Hodina: ");
while (U == true && ch < 24) {
ch++; //ch stands for hour variable, it is integer
U = false;
lcd.setCursor(9, 1);
lcd.print(ch);
}
我指望这个:
zacatek = ((ch * 3600) + (cm * 60) + cs);
zacatek 是 unsigned long,cm 和 cs 的输入方式与 ch 相同(但在其他情况下)。然后我使用但在串行上打印它 Serial.println(zacatek);
,例如,对于时间 20:0:0(ch = 20, cm = 0, cs = 0),它返回我 6464。或者,对于时间 19:16:0,它返回我 3824。谁能告诉我问题出在哪里?
解决方案
大多数 Arduino 板上的 int 值是 16 位宽,所以如果你乘以你会得到比uint16_t 的最大值3600*20
大得多的数字。65535
但是,如果你减去,72000 - 65536
你会得到 value 6464
。顺便说一句:有符号整数溢出行为未由 C++ 规范定义(它取决于平台),但它通常会溢出 32767
to-1
和-32768
to0
如果您需要更大的值,请使用int32_t
oruint32_t
代替。对于常量INT32_C(3600) * ch
或 UINT32_C(3600) * ch
可以使用 - 如果您不想更改ch
.
推荐阅读
- java - 使用 Jsoup 获取嵌套在类中的类的 src
- javascript - 图像、文本和按钮对齐方式不得根据窗口大小而改变
- javascript - p5.js 形状循环错误(全部卡在一点)
- r - facet_wrap 具有相等的条宽
- gcc - 在单个共享对象上使用 ASan
- node.js - 安装 Deno 后,VSCode Nodejs 项目中出现 linting 问题
- google-sheets - 使用所选列更新条目的平均值
- saxon - 在 eXist-db 5+ 中为 xinclude 配置 Saxon
- php - 复选框的变量未定义
- numpy - bisect_right 用于 numpy 数组