在 Arduino 中计算无意义的数字
Counting in Arduino making nonsens numbers
我想将输入的时间日期转换为秒。
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 是无符号长整数,cm 和 cs 的输入方式与 ch 相同(但在其他情况下)。
然后我使用 Serial.println(zacatek);
在 Serial 上打印它
但是例如,对于时间 20:0:0(ch = 20, cm = 0, cs = 0) 它 returns 我 6464。
或者,时间 19:16:0 它 returns 我 3824。
有人能告诉我问题出在哪里吗?
大多数 Arduino 板上的 int 值是 16 位宽,所以如果你乘以 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
.
的数据类型
我想将输入的时间日期转换为秒。
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 是无符号长整数,cm 和 cs 的输入方式与 ch 相同(但在其他情况下)。
然后我使用 Serial.println(zacatek);
在 Serial 上打印它
但是例如,对于时间 20:0:0(ch = 20, cm = 0, cs = 0) 它 returns 我 6464。
或者,时间 19:16:0 它 returns 我 3824。
有人能告诉我问题出在哪里吗?
大多数 Arduino 板上的 int 值是 16 位宽,所以如果你乘以 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
.