Подсчитывать в Arduino делать бессмысленные числа - PullRequest
0 голосов
/ 04 июня 2018

Я хочу преобразовать введенную дату времени в секунды.

    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 имеет длину без знака, см и cs вводятся одинаковокак ch (но в другом случае).Затем я печатаю его на Serial, используя Serial.println(zacatek); Но, например, для времени 20: 0: 0 (ch = 20, cm = 0, cs = 0) он возвращает мне 6464. Или для времени 19: 16: 0 он возвращаетмне 3824. Может кто-нибудь сказать мне, где проблема?

1 Ответ

0 голосов
/ 04 июня 2018

Значение int имеет ширину 16 бит на большинстве плат Arduino, поэтому если вы умножите 3600*20, вы получите число, намного большее, чем 65535, что является максимальным значением для uint16_t.Однако, если вы вычтете 72000 - 65536, вы получите значение 6464.Кстати: поведение целочисленного переполнения со знаком не определено спецификацией C ++ (зависит от платформы), но обычно оно переполняется как 32767 до -1 и -32768 до 0

Если вам нужны большие значения, используйтеint32_t или uint32_t вместо.Для констант можно использовать INT32_C(3600) * ch или UINT32_C(3600) * ch - если вы не хотите изменять тип данных для ch.

...