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_tonumberlua_tointegerは、あなたのニーズ次第です。32ビット未満の整数を変換する場合、たとえば、質問の0〜99999がlua_tointeger選択されます。IEEE-754 互換機では非常に高速です。使用の欠点は、lua_tonumber整数以外の値を誤って変換する可能性があることです。

参照: double を 32 ビット int に丸める高速な方法の説明

于 2013-09-04T08:59:18.753 に答える