前面一片文章中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