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的主要内容,如果未能解决你的问题,请参考以下文章