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

你可能感兴趣的:(Lua脚本浮点转整形bug分析)