【lua】int64的支持

之前的版本中,lua 只默认支持 double 类型,虽然可以通过修改 luaconf.h 里的定义把 lua number改为 int64,但为了 int64 类型放弃 double 显然不合适,属于顾此失彼。

那么,对于 64bit 的解决方案有很多,基本思路都是使用 8bytes 的string / lightuserdata / userdata修改元表来实现。

我们一般使用 8bytes 长的 string 来表示一个 int64 。这样既可以做唯一的 key 用,又不用做复杂的扩展,属于比较好的处理方式

如果想要在项目中直接处理 64bit 的 timestamp。这就需要对int64做数学运算了。在 luajit 中,是定义了一个 userdata 并重载其运算符完成的。即可以用 ffi.cast("int64_t",0) 来构造一个 64bit 的0。对于这种做法,姑且不谈 userdata 的额外开销问题,这样做有一个问题就是当 64bit 的 cdata 做 table 的 key 的时候,相同值的 int64 并不是同一个 key

因此,有了一个更轻量的方式来解决 int64 支持的问题。那就是在 64 位平台上,我们完全可以用 lightuserdata 无损失的表示一个 int64,通过给 lightuserdata 设置 metatable ,我们可以接管它的数据运算。唯一不足的是,比较一个 int64 和普通的 lua number 是否相等时,lua 不能隐式的做转换(大于小于比较没有问题)

由此,风云大神花了点时间构造了一个库。这个库只提供了一个显式的 api ,即构造一个 int64 数字。可以从 lua number 构造,也支持从一个 8 字节宽的小头的字符串来构造。实际在内存储存的是一个 lightuserdata 即一个 64bit 指针(所以这个库不适用于 32 位平台)。也可以通过 C 接口 lua_pushlightuserdata 来把一个 64bit 整数压入堆栈。

把 int64 转换为普通的 lua number 借用了 # 操作符。

GitHub - cloudwu/lua-int64

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米莱虾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值