在 Java 中,当我执行左移操作时,由于整数/长溢出,我得到一个负数结果:0xAAAAAAAA << 7 给我 -183251938048
但是,在 Lua 中,因为一切都是 52 位浮点数的 Lua 数字;我无法在左移时触发溢出:bit_lshift(0xAAAAAAAAA,7) 给我 1431655680
如何在 Lua 中模拟 32 位有符号整数?
在 Java 中,当我执行左移操作时,由于整数/长溢出,我得到一个负数结果:0xAAAAAAAA << 7 给我 -183251938048
但是,在 Lua 中,因为一切都是 52 位浮点数的 Lua 数字;我无法在左移时触发溢出:bit_lshift(0xAAAAAAAAA,7) 给我 1431655680
如何在 Lua 中模拟 32 位有符号整数?
你编写一些 C 函数来处理这个问题,然后将它们导出到 Lua。
虽然一般来说,Lua 代码不应该接触这么低级的东西。
我希望我不会因为这样说而被视为拖钓,但从 Lua 模拟 Java 的最佳方法是使用 Lua 中的 Java。
如果您需要模拟 Java,很可能您的 Lua 已经嵌入其中。只需将 Java 的二进制操作暴露给 Lua 程序,它就可以使用它们。
您正在寻找 Lua 中的位操作库。一个这样的库bitop
来自 LuaJIT 的作者,它直接包含它而无需安装。您也可以在标准 Lua 中安装它。
另一个库是bit32
库,它包含在 Lua 5.2 中。
这两个库都允许您操作 32 位数字。例如bitop
:
local bit = require 'bit
print(bit.lshift(0xAAAAAAAA, 7)) --> 1431655680
我不知道你是如何得到负数的,因为 1431655680 是我在 C 中通过 (0xAAAAAAAAA<<7)&0xFFFFFFFF 得到的(并且也在“编程计算器”中这样做)。