ESP32 Arduino项目数值计算输出异常原因咨询
ESP32 Arduino项目中整数溢出导致数值输出异常的原因
你在ESP32 Arduino项目中定义reset_time为24L * 60 * 60 * 1000 * 1000(理论值为86400000000),但实际输出结果与预期不符。
代码示例
auto reset_time = 24L * 60 * 60 * 1000 * 1000; //86400000000 Serial.print("Reset Timer in: "); Serial.println(reset_time); Serial.print((reset_time / 1000)); Serial.println(" ms"); Serial.print((reset_time / 1000 / 1000)); Serial.println(" s"); Serial.print((reset_time / 1000 / 1000 / 60)); Serial.println(" m"); Serial.print((reset_time / 1000 / 1000 / 60 / 60)); Serial.println(" h");
实际输出
21:05:58.310 -> Reset Timer in: 500654080 21:05:58.310 -> 500654 ms 21:05:58.310 -> 500 s 21:05:58.310 -> 8 m 21:05:58.310 -> 0 h
异常原因分析
这是整数溢出导致的问题,具体细节:
- ESP32的Arduino环境中,默认
long是32位有符号整数,最大值仅为2147483647。 - 虽然你给
24加了L后缀(标记为long型),但乘法运算到86400 * 1000 * 1000时,结果86400000000已经远超32位long的上限,触发溢出。整数溢出后,数值会被截断为符合32位存储的循环值,也就是你看到的500654080。 - 要存储86400000000这个值,需要使用64位整数类型(
long long),其最大值为9223372036854775807,完全能容纳目标数值。
修复方案
- 方法一:将参与运算的至少一个常量标记为
long long类型(加LL后缀),让整个乘法以64位整数执行:auto reset_time = 24L * 60 * 60 * 1000 * 1000LL; - 方法二:直接将
reset_time声明为long long类型:long long reset_time = 24LL * 60 * 60 * 1000 * 1000;
内容的提问来源于stack exchange,提问作者Nick Prozee
相关产品推荐
相关产品推荐

