首页 > 解决方案 > 在 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。谁能告诉我问题出在哪里?

标签: timearduinointarduino-ide

解决方案


大多数 Arduino 板上的 int 值是 16 位宽,所以如果你乘以你会得到比uint16_t 的最大值3600*20大得多的数字。65535但是,如果你减去,72000 - 65536你会得到 value 6464。顺便说一句:有符号整数溢出行为未由 C++ 规范定义(它取决于平台),但它通常会溢出 32767to-1-32768to0

如果您需要更大的值,请使用int32_toruint32_t代替。对于常量INT32_C(3600) * chUINT32_C(3600) * ch可以使用 - 如果您不想更改ch.


推荐阅读