当前位置:网站首页>【lua】int64的支持
【lua】int64的支持
2022-07-04 22:17:00 【米莱虾】
之前的版本中,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 借用了 # 操作符。
边栏推荐
- 关于栈区、堆区、全局区、文字常量区、程序代码区
- Energy momentum: how to achieve carbon neutralization in the power industry?
- Common open source codeless testing tools
- LOGO特訓營 第一節 鑒別Logo與Logo設計思路
- 2022-07-04:以下go语言代码输出什么?A:true;B:false;C:编译错误。 package main import “fmt“ func main() { fmt.Pri
- 机器人相关课程考核材料归档实施细则2022版本
- The table is backed up in ODPs. Why check m in the metabase_ Table, the logical sizes of the two tables are inconsistent, but the number of
- LOGO特訓營 第三節 首字母創意手法
- B站大量虚拟主播被集体强制退款:收入蒸发,还倒欠B站;乔布斯被追授美国总统自由勋章;Grafana 9 发布|极客头条
- HBuilder X 常用的快捷键
猜你喜欢
Tla+ introductory tutorial (1): introduction to formal methods
Scala下载和配置
TLA+ 入门教程(1):形式化方法简介
Logo special training camp Section V font structure and common design techniques
Google Earth Engine(GEE)——基于 MCD64A1 的 GlobFire 日常火灾数据集
传智教育|如何转行互联网高薪岗位之一的软件测试?(附软件测试学习路线图)
Google Earth Engine(GEE)——Tasks升级,实现RUN ALL可以一键下载任务类型中的所有影像
Huawei Nova 10 series released Huawei application market to build a solid application security firewall
Xiangjiang Kunpeng joined the shengteng Wanli partnership program and continued to write a new chapter of cooperation with Huawei
AscendEX 上线 Walken (WLKN) - 一款卓越领先的“Walk-to-Earn”游戏
随机推荐
Concurrent optimization summary
POM in idea XML dependency cannot be imported
Introducing QA into the software development lifecycle is the best practice that engineers should follow
Locust performance test - environment construction and use
现在mysql cdc2.1版本在解析值为0000-00-00 00:00:00的datetime类
LOGO特训营 第三节 首字母创意手法
Detailed explanation of flask context
Force buckle 2_ 1480. Dynamic sum of one-dimensional array
Use blocconsumer to build responsive components and monitor status at the same time
How diff are the contents of the same configuration item in different environments?
【OpenGL】笔记二十九、抗锯齿(MSAA)
繁華落盡、物是人非:個人站長該何去何從
1807. Replace the parentheses in the string
Now MySQL cdc2.1 is parsing the datetime class with a value of 0000-00-00 00:00:00
Deveco device tool 3.0 release brings five capability upgrades to make intelligent device development more efficient
Naacl-22 | introduce the setting of migration learning on the prompt based text generation task
Play with grpc - go deep into concepts and principles
PostgreSQL JOIN实践及原理
High school physics: linear motion
阿里推出新品牌“瓴羊”,致力成为“数字化领头羊”