【问题标题】:Can I use lua_tointeger() for off_t?我可以将 lua_tointeger() 用于 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()

【问题讨论】:

标签: c lua


【解决方案1】:

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

the sourcelua_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、偏移和位置相关的操作系统相关函数)。

    【讨论】:

      猜你喜欢
      • 2021-08-04
      • 2013-08-21
      • 2011-08-22
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 2013-10-24
      • 2017-05-03
      相关资源
      最近更新 更多