Lua 奇怪的最小整数

问题(在 Lua 5.3 和 5.4 版本上测试):

a = -9223372036854775807 - 1 ==> -9223372036854775808  (lua 整数)
b = -9223372036854775808     ==> -9.2233720368548e+018 (lua 数字)

问题

是否可以在不修改 "luaconf.h" 或写入 "-9223372036854775807 - 1" 的情况下获取 "-9223372036854775808"?

点赞
用户1847592
用户1847592

当你在程序中写入 b = -9223372036854775808 时,Lua 解释器将其视为“对正整数常量应用否定运算”,但是正常量超出了整数范围,所以它被视为浮点数,并且负数被应用于浮点数,最终结果是浮点数。

有两种方法可以获得最小整数:

  1. 位运算符将浮点数转换为整数(位或运算的优先级比否定运算更低):
b = -9223372036854775808|0
  1. 使用 math 库中的特殊常量:
b = math.mininteger

注意:

请注意,表达式 b = -9223372036854775808|0 中的附加位或符号不会使您的程序变慢。实际上,所有计算(否定和位或运算)都是在编译时完成的,字节码只包含您需要的最终常量:

$ luac53 -l -l -p -
b = -9223372036854775808|0

main <stdin:0,0> (2 instructions at 0x244f780)
0+ params, 2 slots, 1 upvalue, 0 locals, 2 constants, 0 functions
    1   [1] SETTABUP    0 -1 -2 ; _ENV "b" -9223372036854775808
    2   [1] RETURN      0 1
constants (2) for 0x244f780:
    1   "b"
    2   -9223372036854775808
locals (0) for 0x244f780:
upvalues (1) for 0x244f780:
    0   _ENV    1   0
2020-09-10 04:29:36