You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:10:46