我可以将 lua_tointeger() 用于 off_t 吗?

Posted

技术标签:

【中文标题】我可以将 lua_tointeger() 用于 off_t 吗?【英文标题】:Can I use lua_tointeger() for off_t? 【发布时间】:2013-10-01 07:25:03 【问题描述】:

在将 Lua 数字转换为 off_t 值时,我应该使用 lua_tointeger() 还是 lua_tonumber()

我检查了 Lua 本身的源代码,我发现他们的 file:seek 函数使用 lua_Number,而不是 lua_Integer

我还看到luaposix 包广泛使用lua_tonumber()(或 luaL_checknumber() 等),甚至读取文件描述符(!)。

那么size_t呢?

我是否应该走“极端”,对所有整数 C 类型(mode_t、size_t 等)使用lua_tonumber()(和lua_pushnumber())?或者我应该通常使用lua_tointeger() 并仅在我“感觉”它是一个潜在的大数字时才使用lua_tonumber()

【问题讨论】:

请始终链接到正确的来源。你链接到韦诺之战代码,而不是original Lua file:seek implementation。它们碰巧是一样的,但你永远不知道未来。 【参考方案1】:

由于off_tsize_t都是整数类型,你应该使用lua_tointeger

从the source,lua_tointeger 实际上得到的数字是lua_Number,然后是converts it to lua_Integer。唯一需要担心的是lua_Integer 可能太小,但因为它被实现为ptrdiff_t,实际上通常在 32 位机器上是 32 位,在 64 位机器上是 64 位。

【讨论】:

【参考方案2】:

如果你自己构建 Lua,你可以在 luaconf.h 中查看 lua_Number 和 lua_Integer 是如何定义的。 通常 lua_number 和 double 是一回事,而 lua_Integer 是 ptrdiff_t。

ptrdiff_t(通常是int32_tint64_t)比double更接近off_tuint32_tuint64_t)但Lua可能会以double格式存储数字无论如何

另一方面,如果我没记错的话,double 可以精确地存储高达 2^52 的整数。在大多数情况下,它应该足够了。

我建议使用 lua_*number() 在您希望使用整数时使用 float/doublelua_*integer()(就像所有那些与 FD、偏移和位置相关的操作系统相关函数)。

【讨论】:

以上是关于我可以将 lua_tointeger() 用于 off_t 吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将班级成员的哈希码用于班级吗?

Asyncio 两个循环用于不同的 I/O 任务?

用于 I/O 的最新 Windows 线程池 API 使用情况

来自自定义数据的模型 I/O 网格

堆排序(Heapsort),优先队列可以用于O(N log N)

linux上的缓冲异步文件I/O