我试图将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
};
Run Code Online (Sandbox Code Playgroud)
如果我使用lua_tointeger(),它将返回0并将通过我的检查.
我检查了两个API描述,但我仍然不知道为什么他们有不同的行为.这些行为是否与机器无关?使用lua_tonumber()更好的方法吗?
我可以使用以下代码检查结果吗?(跨平台)
if (!lua_isnumber(Lua, -1)) { //error }
result = lua_tonumber(Lua, -1);
if (result < 0 || result > 99999) { // error2 }
// pass
Run Code Online (Sandbox Code Playgroud)
从手册参考lua_tointeger:
\n\n\n将给定可接受索引处的 Lua 值转换为有符号整数类型
\nlua_Integer。Lua值必须是数字或可转换为数字的字符串(参见\xc2\xa72.2.1);否则,lua_tointeger返回0
与 相同lua_tonumber。因此,当您获得means的返回值时,0您正在传递一个不可转换的字符串。该数字对于(与默认情况下相同)类型213232127162767162736718238168263816873来说太大。lua_Integerptrdiff_t
\n\n\n这些行为与机器无关吗?使用 lua_tonumber() 是更好的方法吗?
\n
在某种程度上,它是机器相关的,因为类型lua_Integer是机器相关的。同样,这个数字213232127162767162736718238168263816873对于任何普通整数类型来说都太大了。到底用lua_tonumber还是用,lua_tointeger就看你的需要了。如果转换小于 32 位的整数,例如问题中的 0~99999,lua_tointeger则由您选择。在 IEEE-754 兼容机器中速度非常快。使用的缺点lua_tonumber是它可能会错误地转换非整数值。
参考:解释将 double 舍入为 32 位 int 的快速方法
\n| 归档时间: |
|
| 查看次数: |
3227 次 |
| 最近记录: |