NodeMCU Lua 整数最大值为 2^31

Posted

技术标签:

【中文标题】NodeMCU Lua 整数最大值为 2^31【英文标题】:NodeMCU Lua integer max value is 2^31 【发布时间】:2020-12-09 05:58:23 【问题描述】:

SDK 3.0.1-dev(fce080e) 上的 Lua 5.1.4 尝试使用 node.dsleepMax() 并返回一个非常小的数字(147324921)。然后我尝试手动将 node.dsleep 中的睡眠时间设置为 32 位最大值(4294967295),它只保持睡眠大约 30 分钟左右。

尝试了以下方法:

    sleeptime = 4294967295
    > 
    =print(sleeptime)

2147483647

这是 2^31 -1。

还做了一个循环添加到变量中,当它达到 2^31 时变为负数。

问题:

    为什么变量在 2^31 处换行? node.dsleep 不应该接受 SDK 2.1 及更高版本的 64 位值吗?

问候,

塞萨尔

【问题讨论】:

很可能您使用的是固件 int 版本(32 位)而不是浮点(32 位,精度为 23 位)。此限制存在于 lua 中,而不存在于 SDK 中。 Darius,我想过,但想在构建另一个固件之前进行验证。我正在使用整数固件。那么,它是一个有符号整数,因此是 31 位加符号信息,对吗? 最大正符号整数正好是 2^31-1。在lua源代码文件node.c函数node_deepsleep内部使用uint64和system_deep_sleep。但是如果你使用浮点固件,你会失去计算睡眠时间的精度,即浮点数 2^23 == 2^23+1 谢谢你的解释! 【参考方案1】:

您已经收到了一些关于 int 与 float 的反馈。至于 dsleep the documentation 没有明确声明它接受 64 位值,但这确实是 https://github.com/nodemcu/nodemcu-firmware/pull/2358 所发生的事情(自 2018 年 4 月起)。

【讨论】:

谢谢马塞尔!我从文档中提供的链接中看到了 64 位的信息,该链接指向您关于 Thingpulse 的文章。我只是不认为我需要浮动固件,因为它是一个整数。我刚刚刷了一个浮动固件,它工作正常:-) 抱歉缺少提示。我们 NodeMCU 也接受改进文档的 PR ;-)

以上是关于NodeMCU Lua 整数最大值为 2^31的主要内容,如果未能解决你的问题,请参考以下文章

原始数据类型

我需要 NodeMCU 中的 Lua 数学库

剑指Offer(31-40)

无法上传到 NodeMCU Lua

用Lua 编写找出两个数的最大公约数,要怎么编写

ESP8266 NodeMCU Lua 如何清除堆?