战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  251 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

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

posted on 2010-02-04 12:49 战魂小筑 阅读(5794) 评论(9)  编辑 收藏 引用 所属分类: 脚本技术程序调试技术C++/ 编程语言

评论

# re: Lua脚本浮点转整形bug分析 2010-02-04 14:02 LOGOS
两者是不同的
1 ->
int i = 0xFFFFFFFF;
double d = (double)i; // d = -1
int a = (int)d; // a = -1

2 ->
double d = (double)0xFFFFFFFF; // d = 4294967295
int a = (int)d; // a overflow  回复  更多评论
  

# re: Lua脚本浮点转整形bug分析 2010-02-04 14:28 LOGOS
lua_pushinteger(L, ptrdiff_t)
第二个参数是ptrdiff_t,不是int
我比较感兴趣你是在什么平台下编译的,32位?64位?
编译器是什么,VC?gcc?  回复  更多评论
  

# re: Lua脚本浮点转整形bug分析 2010-02-04 17:34 Davy.xu
@LOGOS

VC,32位
  回复  更多评论
  

# re: Lua脚本浮点转整形bug分析 2010-02-04 17:47 黄路易
我怀疑是你的lua嵌入代码或者编译环境的问题,因为在纯lua的命令行中没有你上一篇文章的问题,或者你看看我写的这篇?
http://www.hlouis.com/develop/lua-cant-do-math/
不知道有没有帮助  回复  更多评论
  

# re: Lua脚本浮点转整形bug分析 2010-02-04 17:58 LOGOS
@黄路易
可能是优化问题
把lua_pushinteger((double)(int)0xFFFFFFFF)
优化成了
lua_pushinteger((double)0xFFFFFFFF)

Davy跟一下汇编,然后贴出来看看  回复  更多评论
  

# re: Lua脚本浮点转整形bug分析 2010-02-04 19:14 Davy.xu
@黄路易
在lua虚拟机内部的数字,和你用print打出来都是“貌似"对的
这个问题,我朋友项目也发生过,做法就是全用整数  回复  更多评论
  

# re: Lua脚本浮点转整形bug分析 2010-02-04 19:18 Davy.xu
@LOGOS
你的这段代码我试过,不管用的
我现在工程里已经解决这个问题,还是得用整数,就是看起来非十六进制的颜色很恶心
  回复  更多评论
  

# re: Lua脚本浮点转整形bug分析 2010-02-22 14:11 Quon
这个问题的原因是DirectX修改了系统行为强制把浮点数定为单精度,造成lua整型的范围变小了  回复  更多评论
  

# re: Lua脚本浮点转整形bug分析 2010-02-23 08:56 Davy.xu
@Quon
这个例子中并没有使用到DX  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理