Lua 5.3/5.4中64位无符号整数表现与《Lua编程》不符的咨询
Lua 5.3/5.4 中大型无符号整数输入问题解答
问题1:为何书中示例与实际执行结果不符?
- Lua 5.3+ 默认使用有符号64位整数,最大值为
9223372036854775807(即 2^63 - 1)。你直接输入的十进制数13835058055282163712是 3×2^62,超出了有符号64位整数的范围,因此Lua会自动将其转为浮点数存储。 - 书中示例的核心是通过位运算构造数值(
3 << 62),而非直接输入十进制大数。位运算在Lua中是对整数进行补码操作,3 << 62的结果会因有符号整数溢出,表现为负数-4611686018427387904;而直接输入十进制大数时,Lua判断无法用整数存储,才会转为浮点数,这是两者差异的根本原因,和语言后续更新无关。
问题2:如何以十进制形式输入大型无符号整数不转为浮点数?
Lua默认仅支持64位有符号整数,无符号整数需通过补码模拟,以下是可行方案:
- 用十六进制字符串转换:将十进制数转为十六进制字符串,通过
tonumber指定基数16来得到整数。例如你的目标数十六进制为0xC000000000000000,代码如下:x = tonumber("C000000000000000", 16) print(x) --> -4611686018427387904 print(math.type(x)) --> integer - 通过位运算构造:直接使用书中注释的位运算方式生成数值,避免直接输入十进制大数:
x = 3 << 62 print(x) --> -4611686018427387904 print(math.type(x)) --> integer - 处理超64位无符号整数:若需超出64位范围的数值,可使用第三方大数库(纯Lua或LuaJIT扩展),但默认Lua环境仅支持64位整数的补码模拟无符号数。
内容的提问来源于stack exchange,提问作者Sebastien Diot
相关产品推荐
相关产品推荐

