Browsed by
Tag: integer

Lua小坑之整数

Lua小坑之整数

在最近的一次开发中,需要将两个整数做除法,例如以下简单语句:

c=a/b

由于a和b都是整数,因此我又想当然地认为c也是整数,而实际上Lua将c转换成浮点数,导致后续逻辑判断和处理都出错了。这又是Lua让人意外的一个地方,我很困惑设计者为什么要这么设计。在Lua 5.3的reference manual文档中,对此有明确说明:

Exponentiation and float division always convert integer operands to floats.

据说5.3版本之前,Lua甚至都不支持整数,只有浮点数。而我们的程序通常只有两种类型:整数和字符串,因此重新将计算结果转换回整数是个急需解决的问题。在翻看manual文档时,看到math.tointeger接口,试了一下,结果极为悲催,返回了nil值!这是搞个毛线啊?

幸运地是lua对C很友好,因此只好手工打造一个接口给Lua程序用:

static int bluaToInt(lua_State *L)
{
 assert(NULLP!=L);
 int intVal = 0;
 int type = lua_type(L,1);
 switch( type )
 {
 case LUA_TNUMFLT: 
 intVal = (int)luaL_checknumber(L,1);
 break;
 
 case LUA_TNUMINT:
 intVal=(int)luaL_checkinteger(L, 1);
 break;

 case LUA_TSTRING:
 intVal = BclStrToInt(luaL_checkstring(L,1));
 break;
 
 default:
 assert(0);
 break;
 }

 lua_pushinteger(L, intVal);
 return 1;
}

将上述函数注册到Lua中,定义为“ToInt”,然后在脚本中使用即可。由此上述示例代码变为:

c=ToInt(a/b)

这样就能确保c为整数类型。