您的位置:首页 > 编程语言 > Lua

Lua5.3 异或操作的一个坑

2016-02-01 23:15 2621 查看
最近在开发项目时,需要用到Lua的一些位操作,其中用到了异或,写代码的时候想当然的就以为在Lua5.3里,异或操作也像C语言一样是^, 然后就写下去了,

跑的时候也没报错,就没有再去深究这个符号的意义,直到再次测试这段代码的时候,发现结果怎么也不对,之前写的“异或”,得出来的结果居然是inf, 无穷大,于是,在绕了很多弯路,写过各种测试代码后得知:^此符号不是异或。

而实际上,在Lua5.3里,^是乘方,~才是异或,这一点实在是坑,因为~还是按位非符号,这里贴出云风的参考手册,希望大家能少踩此坑:

http://cloudwu.github.io/lua53doc/manual.html#3.4.2


3.4.1 – 数学运算操作符

Lua 支持下列数学运算操作符:

+
:
加法
-
:
减法
*
:
乘法
/
:
浮点除法
//
:
向下取整除法
%
:
取模
^
:
乘方
-
:
取负

除了乘方和浮点除法运算, 数学运算按如下方式工作: 如果两个操作数都是整数, 该操作以整数方式操作且结果也将是一个整数。 否则,当两个操作数都是数字或可以被转换为数字的字符串 (参见 §3.4.3)时,
操作数会被转换成两个浮点数, 操作按通常的浮点规则(一般遵循 IEEE 754 标准) 来进行,结果也是一个浮点数。

乘方和浮点除法 (
/
) 总是把操作数转换成浮点数进行,其结果总是浮点数。 乘方使用 ISO C 函数
pow
, 因此它也可以接受非整数的指数。

向下取整的除法 (
//
) 指做一次除法,并将商圆整到靠近负无穷的一侧, 即对操作数做除法后取 floor 。

取模被定义成除法的余数,其商被圆整到靠近负无穷的一侧(向下取整的除法)。

对于整数数学运算的溢出问题, 这些操作采取的策略是按通常遵循的以 2 为补码的数学运算的 环绕 规则。 (换句话说,它们返回其运算的数学结果对 264 取模后的数字。)


3.4.2 – 位操作符

Lua 支持下列位操作符:

&
:
按位与
|
:
按位或
~
:
按位异或
>>
:
右移
<<
:
左移
~
:
按位非

所有的位操作都将操作数先转换为整数 (参见 §3.4.3), 然后按位操作,其结果是一个整数。

对于右移和左移,均用零来填补空位。 移动的位数若为负,则向反方向位移; 若移动的位数的绝对值大于等于 整数本身的位数,其结果为零 (所有位都被移出)。

=============================
所以说还是对Lua5.3不熟悉啊,当时参与此项目之前,对Lua还基本不会,不过Lua实在是太好上手了,这也是它的优点之一,所以基本没怎么看过参考手册,也没看过书,基本上照着别人代码边看边写,遇到不会的就问下同事,所以导致这些细节方面容易出问题。

看来抽空还是要深入学习下这些语言细节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: