3

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

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

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

那么size_t呢?

我应该去“极端”并为所有整数 C 类型(mode_t、size_t 等)使用lua_tonumber()(and ) 吗?lua_pushnumber()或者我应该通常只在我“感觉”它是一个潜在的大数字时才使用lua_tointeger()和诉诸?lua_tonumber()

4

2 回答 2

2

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

源头上,lua_tointeger实际上得到的数字为lua_Number,然后将其转换为 lua_Integer。唯一需要担心的是它lua_Integer可能太小了,但实际上它的实现ptrdiff_t方式通常是 32 位机器上的 32 位和 64 位机器上的 64 位。

于 2013-10-01T08:22:37.660 回答
1

如果你自己构建 Lua,你可以检查luaconf.hlua_Number 和 lua_Integer 是如何定义的。通常 lua_number 和 double 是一样的,而 lua_Integer 是 ptrdiff_t。

ptrdiff_t(通常int32_tor )比( or )int64_t更接近,但Lua 可能无论如何都会以格式存储数字。off_tuint32_tuint64_tdoubledouble

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

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

于 2013-10-01T08:16:09.363 回答