Ho provato a convertire una stringa da Lua (5.1.5) in un numero intero e verificare se il numero è un numero intero valido (0 ~ 99999). Tuttavia, ho trovato che lua_tonumber() ha un comportamento diverso da lua_tointeger() quando si ha a che fare con un intero grande.Perché lua_tonumber() ha un comportamento diverso da lua_tointeger() quando si ha a che fare con un numero intero grande?
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
};
Se uso lua_tointeger(), restituisce 0 e passerà il mio controllo.
Controllo entrambe le descrizioni API, ma non so ancora perché hanno comportamenti diversi. Questi comportamenti sono indipendenti dalla macchina? Sta usando lua_tonumber() in un modo migliore?
Posso utilizzare il codice seguente per verificare il risultato? (Cross-platform)
if (!lua_isnumber(Lua, -1)) { //error }
result = lua_tonumber(Lua, -1);
if (result < 0 || result > 99999) { // error2 }
// pass
Interi sono 2 o 4 byte, 'double' è di 8 byte. – hjpotter92