Lua C API:处理大数 Lua 语言支持任意大小的整数和浮点数,并提供了一组 C API 使开发者可以在 C 语言中使用这些数值。这些 C API 也允许开发者处理特别大的数值,例如超出 C 语言内置类型所支持的范围的整数。在 Lua 中,这些大数类型被称为 bignums。要使用 bignums,开发者需要使用 lua_pushinteger 或 lua_pushnumber 函数将这些数值推入 Lua 栈。 在 C 语言中,开发者可以使用 lua_isinteger 和 lua_tointegerx 函数检查和获取整数类型的值,并使用 lua_isnumber 和 lua_tonumberx 函数检查和获取浮点数类型的值。当处理 bignums 时,开发者需要注意,Lua 5.4 及更高版本引入了一个新的类型 __int128,用于表示大于 64 位的整数。在上述版本中,使用 lua_tointegerx 函数从栈中读取 bignums 仍然会返回 64 位整数类型,但使用 lua_tointegerfunction 函数则会返回 __int128 类型。要使用 __int128,开发者需要在编译时使用 -DLUA_USE_C89 宏定义建立 C89 环境。 总之,Lua C API 提供了一组灵活的函数使开发者可以轻松处理大数。

我在我的代码中处理皮秒(数字大于 10^12)。

C 代码将数据传递给 Lua(atime 和 eventid 都是 size_t 类型)

lua_getglobal(luactx, "timer_callback");
lua_pushunsigned(luactx, atime);
lua_pushunsigned(luactx, eventid);
lua_pcall(luactx, 2, 0, 0);

Lua 函数

function timer_callback(time, eventid)
  if eventid == TX_CLOCK then
  out_log(tostring(time)) --result is random garbage
  set_callback(time + 1000000000000, TX_CLOCK)
  return
  end
end

我尝试使用 lua_pushnumber,但在 Lua 中得到了负数。

点赞
用户19719
用户19719

Lua 5.3 支持 lua_Integer,默认为 64 位。来自 参考手册

lua_Integer

typedef ... lua_Integer;

Lua 中整数的类型。

默认情况下,这个类型是 long long (通常是一个 64 位的二进制补码整数),但是可以通过修改 luaconf.h 中的 LUA_INT 将其改为 long 或者 int(通常是一个 32 位的二进制补码整数)。还定义了常量 LUA_MININTEGERLUA_MAXINTEGER,分别表示能存储在这个类型中的最小和最大值。

Lua 5.2 可以通过编辑 luaconf.h 来将 Lua 强制转换为不同的数字类型。数字类型被定义为 LUA_NUMBER

对于 lua 5.1,可以安装 lnum 补丁来修改整数类型。

2014-09-23 17:31:31