从C中查找Lua数的符号

从C中查找Lua数的符号,c,lua,C,Lua,我有一个问题似乎很琐碎 假设Lua堆栈的顶部有一个数字。我想知道(在C中)这个数字是正数、负数还是零 一个简单的解决方案是: lua_Number num = lua_tonumber(L, -1); if (num > 0) print("positive") else if (num < 0) print("negative") else print("zero") lua_Number num=lua_tonumber(L,-1); 如果(数值>0) 打印(

我有一个问题似乎很琐碎

假设Lua堆栈的顶部有一个数字。我想知道(在C中)这个数字是正数、负数还是零

一个简单的解决方案是:

lua_Number num = lua_tonumber(L, -1);
if (num > 0)
   print("positive")
else if (num < 0)
   print("negative")
else
   print("zero")
lua_Number num=lua_tonumber(L,-1);
如果(数值>0)
打印(“正片”)
else if(num<0)
打印(“负片”)
其他的
打印(“零”)
但是,这在Lua5.3中可能无法正常工作,因为如果堆栈上是Lua整数(Lua_integer),它可能不适合我们的
num
变量(即Lua_数)

那么,我如何编写我的C代码来在Lua5.1/5.2和Lua5.3中工作呢


(顺便说一句,我只对符号而不是数字本身感兴趣的原因是,这个数字是排序算法的比较函数的返回值。它是比较两个项目的结果。)

一个可能的解决方案是让Lua为您进行比较。这可以使用(或者,对于LuaJIT和Lua5.1):

#如果LUA_VERSION_NUM==501
#定义LUA_小于(state,index1,index2)LUA_小于(state,index1,index2)
#elif LUA_版本号>501
#定义LUA_小于(state,index1,index2)LUA_比较(state,index1,index2,LUA_OPLT)
#恩迪夫
卢厄数(L,0);
if(LUA_小于(L,-1,-2)){
//0num
}否则{
//0==num
}
卢厄波普(L,1);

太好了!但是,我希望我的代码也能在Lua5.1/LuaJIT上运行,而且它们没有Lua_比较。所以这个解决方案不适合我。非常感谢。如果明天我得不到其他答案,我会选择你的答案。在我发布了我的问题后,我编写了一个解决方案,使用自动工具检测Lua5.3的
Lua\u-isinteger()
(通过执行
AC\u-CHECK\u-FUNCS([Lua\u-isinteger])
)是否存在,但您的解决方案显然更适合一般观众。是的,也许我会改用它。如果
lua_Number
是一个浮点数,那么即使它在转换过程中失去了一些精度,它仍然会保留符号。@三十二上校:你确定吗?假设lua_整数和lua_数都是64位(这是典型的)。现在,由于lua_数有更大的范围,因此一些lua_整数不能精确地表示为lua_数。你假设它们仅仅会在转换时失去精度。但这种转换的结果可能是“未定义的行为”?
#if LUA_VERSION_NUM == 501
  #define LUA_LESS_THAN(state, index1, index2) lua_lessthan(state, index1, index2)
#elif LUA_VERSION_NUM > 501
  #define LUA_LESS_THAN(state, index1, index2) lua_compare(state, index1, index2, LUA_OPLT)
#endif

lua_pushnumber(L, 0);
if (LUA_LESS_THAN(L, -1, -2)) {
  // 0 < num
} else if (LUA_LESS_THAN(L, -2, -1)) {
  // 0 > num
} else {
  // 0 == num
}
lua_pop(L, 1);