6

我尝试将字符串从 Lua(5.1.5) 转换为整数,并检查该数字是否为有效整数 (0~99999)。但是,我发现 lua_tonumber() 在处理大整数时的行为与 lua_tointeger() 不同。

int main()
{
    int in;
    double db;

    lua_State* Lua = luaL_newstate();
    luaL_openlibs(Lua);

    lua_pushstring(Lua, "213232127162767162736718238168263816873");
    db = lua_tonumber(Lua, -1);
    in = lua_tointeger(Lua, -1);
    printf("DOUBLE:%f\n", db); // DOUBLE:213232127162767176000119210017101447168.000000
    printf("INT:%d\n", in);    // INT:0
};

如果我使用 lua_tointeger(),它会返回 0 并通过我的检查。

我检查了两个 API 描述,但我仍然不知道为什么它们有不同的行为。这些行为是否与机器无关?使用 lua_tonumber() 是更好的方法吗?

我可以使用以下代码检查结果吗?(跨平台)

if (!lua_isnumber(Lua, -1)) { //error }
result = lua_tonumber(Lua, -1);
if (result < 0 || result > 99999) { // error2 }
// pass
4

1 回答 1

4

从手册参考lua_tointeger

将给定可接受索引处的 Lua 值转换为有符号整数类型lua_Integer。Lua 值必须是数字或可转换为数字的字符串(参见 §2.2.1);否则,lua_tointeger返回0

lua_tonumber. 因此,当您获得0手段的返回值时,您正在传递一个不可转换的字符串。该数字对于(默认情况下相同)类型213232127162767162736718238168263816873来说太大了。lua_Integerptrdiff_t

这些行为是否与机器无关?使用 lua_tonumber() 是更好的方法吗?

在某种程度上,它是机器相关的,因为类型lua_Integer是机器相关的。同样,213232127162767162736718238168263816873对于任何普通的整数类型来说,这个数字都太大了。使用lua_tonumber或使用lua_tointeger取决于您的需要。如果在您的问题中转换小于 32 位的整数,例如 0~99999,lua_tointeger则您可以选择。在兼容 IEEE-754 的机器中速度非常快。使用的缺点lua_tonumber是它可能会错误地转换非整数值。

参考:将双精度数舍入为 32 位整数的快速方法解释

于 2013-09-04T08:59:18.753 回答