Lua内部将数字存储为整数或浮点数。在对两种不同类型的数字进行比较(如小于)时,需要从一种类型转换为另一种类型来进行比较。
整数和浮点数类型根据配置/平台而异,但会做出某些假设。(我只关心“普通”的32位或64位二进制补码整数和32位或64位IEEE754浮点数)。
当整数类型在浮点格式中可能没有精确表示时,Lua尝试将浮点值转换为整数。
这是在一个宏
整数和浮点数类型根据配置/平台而异,但会做出某些假设。(我只关心“普通”的32位或64位二进制补码整数和32位或64位IEEE754浮点数)。
当整数类型在浮点格式中可能没有精确表示时,Lua尝试将浮点值转换为整数。
这是在一个宏
lua_numbertointeger
中完成的。/*
@@ lua_numbertointeger converts a float number with an integral value
** to an integer, or returns 0 if float is not within the range of
** a lua_Integer. (The range comparisons are tricky because of
** rounding. The tests here assume a two-complement representation,
** where MININTEGER always has an exact representation as a float;
** MAXINTEGER may not have one, and therefore its conversion to float
** may have an ill-defined value.)
*/
#define lua_numbertointeger(n,p) \
((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \
(n) < -(LUA_NUMBER)(LUA_MININTEGER) && \
(*(p) = (LUA_INTEGER)(n), 1))
我的问题是:
假设LUA_NUMBER
是一个32位的float
,而LUA_INTEGER
是一个32位的int
,为什么我们可以假设LUA_MIN_INTEGER
(即INT_MIN
)在浮点类型中有一个精确的表示。
(对于64位整数和64位浮点数同样适用... 对于64位整数和32位浮点数呢?)
lua_numbertointeger
不会被使用(至少在Lua虚拟机的比较操作中),因为它可以将整数转换为浮点数而不会失去精度(并以此方式进行比较)。但是了解这一点仍然很好,谢谢。 - user673679