1. 程式人生 > >Lua指令碼浮點轉整形bug分析

Lua指令碼浮點轉整形bug分析

前面一片文章中lua出現的bug,其實是lua本身結構問題導致的:

lua中,數值使用double來儲存,包含整形和double。而解析出來的整形也是被強轉為double進行儲存,這樣就會出問題。

舉一個簡單的例子:

double f = (double)0xffffffff;
int a = int(f);

a肯定不是-1

這裡的文章說明這個型別轉換問題的緣由。

Squirrel指令碼中就不會有這個問題

local a = 0xffffffff

print( a )

結果為-1

檢視其原始碼:

typedef union tagSQObjectValue
{
    struct SQTable *pTable;
    struct SQArray *pArray;
    struct SQClosure *pClosure;
    struct SQGenerator *pGenerator;
    struct SQNativeClosure *pNativeClosure;
    struct SQString *pString;
    struct SQUserData *pUserData;
    SQInteger nInteger;
    SQFloat fFloat;
    SQUserPointer pUserPointer;
    struct SQFunctionProto *pFunctionProto;
    struct SQRefCounted *pRefCounted;
    struct SQDelegable *pDelegable;
    struct SQVM *pThread;
    struct SQClass *pClass;
    struct SQInstance *pInstance;
    struct SQWeakRef *pWeakRef;
    SQRawObjectVal raw;
}SQObjectValue;

可以看到

SQInteger nInteger;
SQFloat fFloat;

是分開儲存的,因此就不會有這個問題

lua解決方法:

1. 將十六進位制換為10進位制儲存

2. 等待大俠或者官方修改程式碼,做出patch