一个星期之前,有一个网友在群里问为什么lua-5.1的lua_number类型为4字节,为什么不是double类型的8字节?带着这个问题,翻看了lua-5.3的代码,在默认情况lua_number都是8字节的。验证如下:a为8字节,如果输出为-1,说明就是64bit(-1在64bit有符号的二进制为0xFFFFFFFFFFFFFFFF)
输出结果为:
说明在默认情况下lua中number都是8字节。
代码如下:INT_MAX定义在系统的头文件limits.h,当前系统int最大值。例如32位INT_MAX为0x7FFFFFFF,64位0x7FFFFFFFFFFFFFFF
#if ((INT_MAX >> 15) >> 15) >= 1
#define LUAI_BITSINT 32
#else
/* 'int' always must have at least 16 bits */
#define LUAI_BITSINT 16
#endif
#if defined(LUA_32BITS)
#if LUAI_BITSINT >= 32
#define LUA_INT_TYPE LUA_INT_INT
#else
#define LUA_INT_TYPE LUA_INT_LONG
#endif
#define LUA_FLOAT_TYPE LUA_FLOAT_FLOAT
#elif defined(LUA_C89_NUMBERS)
#define LUA_INT_TYPE LUA_INT_LONG
#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE
#endif
/*
** default configuration for 64-bit Lua ('long long' and 'double')
*/
#if !defined(LUA_INT_TYPE)
#define LUA_INT_TYPE LUA_INT_LONGLONG
#endif
#if !defined(LUA_FLOAT_TYPE)
#define LUA_FLOAT_TYPE LUA_FLOAT_DOUBLE
#endif
流程图如下:
在默认情况下,LUA_INT_TYPE = LONGLONG,LUA_FLOAT_TYPE=DOUBLE,所以都是64位。那么问题来了,如何修改成32位的呢?从上图中可以知道,只需要定义LUA_32BITS即可。修改src/Makefile,我的是mac电脑,所以在macosx的target增加了-DLUA_32BITS的编译宏
重新编译lua:
make install的过程就不显示了。验证下是否int为32bit:a = 0xFFFFFFFF,如果输出为-1,说明a就是32bit(-1在无符号32位int中的二进制就是0xFFFFFFFF)
结果:
说明修改成功。