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
Lua 支持下列数学运算操作符:
除了乘方和浮点除法运算, 数学运算按如下方式工作: 如果两个操作数都是整数, 该操作以整数方式操作且结果也将是一个整数。 否则,当两个操作数都是数字或可以被转换为数字的字符串 (参见 §3.4.3)时,
操作数会被转换成两个浮点数, 操作按通常的浮点规则(一般遵循 IEEE 754 标准) 来进行,结果也是一个浮点数。
乘方和浮点除法 (
向下取整的除法 (
取模被定义成除法的余数,其商被圆整到靠近负无穷的一侧(向下取整的除法)。
对于整数数学运算的溢出问题, 这些操作采取的策略是按通常遵循的以 2 为补码的数学运算的 环绕 规则。 (换句话说,它们返回其运算的数学结果对 264 取模后的数字。)
Lua 支持下列位操作符:
所有的位操作都将操作数先转换为整数 (参见 §3.4.3), 然后按位操作,其结果是一个整数。
对于右移和左移,均用零来填补空位。 移动的位数若为负,则向反方向位移; 若移动的位数的绝对值大于等于 整数本身的位数,其结果为零 (所有位都被移出)。
=============================
所以说还是对Lua5.3不熟悉啊,当时参与此项目之前,对Lua还基本不会,不过Lua实在是太好上手了,这也是它的优点之一,所以基本没怎么看过参考手册,也没看过书,基本上照着别人代码边看边写,遇到不会的就问下同事,所以导致这些细节方面容易出问题。
看来抽空还是要深入学习下这些语言细节。
跑的时候也没报错,就没有再去深究这个符号的意义,直到再次测试这段代码的时候,发现结果怎么也不对,之前写的“异或”,得出来的结果居然是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实在是太好上手了,这也是它的优点之一,所以基本没怎么看过参考手册,也没看过书,基本上照着别人代码边看边写,遇到不会的就问下同事,所以导致这些细节方面容易出问题。
看来抽空还是要深入学习下这些语言细节。
相关文章推荐
- lua协程用法举例
- lua os.time与os.date的简单用法
- vim+lua
- lua实现单例模式
- lua-excel助手
- lua 和 luajit 性能对比测试
- lua 函数回调技巧
- Leetcode || Evaluate Reverse Polish Notation
- 【Lua】观察者模式在Lua中的实现
- Evaluation of —OLSR—OSPF—BATMAN—AODV
- Evaluating Network Simulation Tools—CORE—NS3—MANET
- Lua消息处理集合
- Lua检查非空
- Lua增加ccbi
- Lua重新加载Lua文件
- Lua封装格式化float
- Lua封装格式化html
- OpenWrt 自学笔记(5)------lua 环境搭建
- Lua封装map
- VMware ESXI5.5 Memories limits resolved soluation.