Lua数字类型的长度是多少字节?

3
什么是数字格式长度(以字节为单位)? 这是一种"多类型"数据格式。它是4个字节?8个字节?有多少?如何在程序中获取它?长度是否取决于操作系统/处理器类型?
在这里https://www.lua.org/pil/2.3.html,文档称这是双精度类型,即有64位。我是正确的吗?

1
有关于编程的问题吗?你真正遇到了什么困难?你是想用Lua还是C来解决它呢? - Yu Hao
我想将十六进制字符串转换为数字。我想知道字符串的最大长度。 - Vyacheslav
@Vyacheslav,实际上,严谨地说,您要的是整数精度(以位为单位),而不是数字类型的大小(以字节为单位)。 :) - unwind
1
@Vyacheslav 那么你应该把这个作为你的问题来问,或者也可以提出另一个问题。实际上它有一个不同的答案。 - Yu Hao
使用53位整数是安全的。 - Egor Skriptunoff
6个回答

6

正如@Roddy所说,整数类型稍微有些复杂。此外,这取决于您的Lua是如何编译的。

基本上,在Lua 5.3中,有两种类型,整数类型lua_Integer和数字类型lua_Number。您可以通过解析块头在Lua内部以编程方式获取它们的长度:

local chunk = string.dump(function() end)
print("lua_Integer", chunk:byte(16))
print("lua_Number", chunk:byte(17))

通常情况下,这两个长度都是8字节。然而,在一些嵌入式平台上,你可能会发现Lua中的lua_Number类型是float(4字节),32位整数或者更奇怪的东西。


2
请注意,这仅适用于PUC-rio lua。它在luajit等其他环境中无法工作。 - daurnimator
@daurnimator 是的,而且块头格式取决于Lua的版本,因此这仅适用于5.3。如果您需要支持更多的Lua版本,则需要先检查版本并为每个版本实现特定的代码。 - catwell

3
根据Lua参考(整数部分):
如果整数算术运算溢出,所有操作都遵循二进制补码算术的通常规则进行包装。(换句话说,它们返回唯一可表示的整数,该整数在模2^64下等于数学结果。)
对于浮点数:
除了指数和浮点除法之外,算术运算符的工作方式如下:如果两个操作数都是整数,则在整数上执行操作,并得到一个整数结果。否则,如果两个操作数都是可以转换为数字的数字或字符串(请参见§3.4.3),则将它们转换为浮点数,按照浮点运算的通常规则(通常是IEEE 754标准),并得到一个浮点数结果。

3
这取决于Lua的版本,以及它是如何编译的。
5.3版本具有真正的整数,通常为64位。参考链接:https://www.lua.org/manual/5.3/manual.html 引用块中提到:"number"类型使用两种内部表示方式,或者说是两个子类型,一个叫做整数(integer),另一个叫做浮点数(float)。
标准的Lua使用64位整数和双精度(64位)浮点数,但您也可以编译Lua,使其使用32位整数和/或单精度(32位)浮点数。
早期版本始终使用64位双精度浮点数,这有效地准确表示高达52位的整数。参考链接:https://www.lua.org/pil/2.3.html

0

作为一种语言,Lua 并没有定义你所询问的内容。用于表示数字的数据类型可能会因版本而异(请注意,“Programming in Lua” 免费在线版本的链接是关于 Lua 5.0 的),但主要是由 Lua 编译的方式定义的,就像其他人已经说过的那样。

请查看 {{link1:luaconf.h}} 以获取所有详细信息。

关于你实际的问题(将十六进制字符串转换为数字),你可以查看对各种输入字符串执行 tonumber() 的结果,与已知结果进行比较:

function hexConvertibeBytes()
    local i, s = 0, ''
    repeat
        i, s = i + 1, s .. 'FF'
        local n = tonumber( s, 16 )
    until n ~= 256^i - 1
    return i - 1
end

获取本机整数宽度的更简单方法是 ('%x'):format(0xffffffffffffffff) - 乘以4可得到位宽,或除以2可得到字节宽。如果您想检查具有大于64位整数的Lua实现,甚至可以扩展ff的数量。 - Stuart P. Bentley

0
我们可以按照以下方式使用 string.pack
s = string.pack("J",0)
number_of_bytes = #s

0
Lua在编译时支持指定浮点数的字节长度(4表示单精度,8表示双精度)和整数的长度(4表示32位,8表示64位)。
要在运行时检查/断言这一点,您可以使用以下方法:
function float_bytes()
    return #string.pack("J", 0)
end

function int_bytes()
    return math.maxinteger == 2147483647 and 4 or math.maxinteger == 9223372036854775807 and 8 or nil
end

这个问题已经有7.5年的历史了。Stackoverflow非常棒。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接