我可以使用lua_tointeger()来获取off_t吗?

在将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()

点赞
用户1022729
用户1022729

如果你自己构建 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。在大多数情况下,这应该已经足够了。

我建议在你期望使用 float/double 时使用 lua_*number(),在你期望使用整数时使用 lua_*integer()(比如所有涉及文件描述符、偏移量和位置的 OS 相关函数)。

2013-10-01 08:16:09
用户1009479
用户1009479

因为 off_tsize_t 都是整数类型,所以应该使用 lua_tointeger

源代码中可以看到, lua_tointeger会将数字作为 lua_Number 获取,然后将其转换为lua_Integer。唯一的担忧是 lua_Integer 可能太小,但由于其实现为 ptrdiff_t,在32位机器上通常为32位,在64位机器上为64位,因此实际上不会有太多问题。

2013-10-01 08:22:37