十六进制转换中 Lua 和 Python 的区别

Difference between Lua and Python in hex conversion

在Python中,我有:

>>> mac_string = "68:a8:6d:0b:90:46"
>>> mac_int = int((mac_string).replace(":", ""), 16)
>>> print(mac_int)
115072593268806

在Lua中,我有:

> mac_string = "68:a8:6d:0b:90:46"
> mac_int = tonumber(mac_string:gsub(':',''),16)
> print(mac_int)
1.1507259326881e+14

为什么相差4?

直到 Lua 版本 5.2,Lua number 类型使用浮点表示,而 Python 使用实际整数只受记忆的束缚。来自 Lua 5.2 documentation:

Number represents real (double-precision floating-point) numbers.

请注意,该数字仍然足够精确,但为了显示四舍五入。如果将生成的整数转换为 Python 中的浮点数(也使用双精度浮点数),您可以看到相同的数字:

>>> float(115072593268806)
115072593268806.0
>>> '{:.13e}'.format(float(115072593268806))
'1.1507259326881e+14'

第二行的格式与 Lua 相同;小数点后13位,采用科学计数法。

您可以告诉 Lua 使用不同的格式打印数字 string.format:

print(string.format("%d", mac_int))

我看到 Lua 5.3 expanded the number type to support 64-bit integers,所以也许升级到那个版本可以解决这个问题。

Lua 5.1,默认情况下,始终将数字存储为 64 位浮点值。 tostring 使用科学计数法打印非常大或非常小的值。

如果用string.format格式化数字,可以得到所有数字:

> print(string.format("%15d", mac_int))
115072593268806

您可能正在使用 Lua 5.2 或更低版本。数字类型在C中默认为double类型。print的默认格式精度不够。


Lua 5.3支持整数子类型,默认为64位。相同代码输出结果:

115072593268806