lua中大数相乘的问题

math.maxinteger * 2 --> -2

原因:math.maxinteger的二进制 :

0111111111111111111111111111111111111111111111111111111111111111

往左移位,最右加一个0,是

1111111111111111111111111111111111111111111111111111111111111110

对应的十六进制机器位 0xFFFFFFFFFFFFFFFE 对应的真值也就是-2

math.mininteger * 2 --> 0

对应二进制:

1000000000000000000000000000000000000000000000000000000000000000

乘二后的二进制:

0000000000000000000000000000000000000000000000000000000000000000

显然是0

math.maxinteger * math.maxinteger

同样采用移位的思路分析,已知maxinteger是奇数,那么就是math.maxinteger的二进制移位n次后再加一个数m,首先确定n是多少,math.maxinteger 是2^63+(-1),n是63, 之后确定m,m=-1

先把math.maxinteger 左移 63位,为:

1000000000000000000000000000000000000000000000000000000000000000

对应真值 mininteger (也就是-2^64)

再加上-math.maxinteger(二进制

1000000000000000000000000000000000000000000000000000000000000001

),

1000000000000000000000000000000000000000000000000000000000000000

1000000000000000000000000000000000000000000000000000000000000001

结果是:

0000000000000000000000000000000000000000000000000000000000000001

显然真值为1

math.mininteger * math.mininteger --> 0

可以从补码乘法的角度理解,具体参考补码乘法。

https://web.archive.org/web/20150213203512/http://pages.cs.wisc.edu/\~cs354-1/beyond354/int.mult.html

方便起见,以4位计算机为例:(有符号整数范围-8到7)

          11111000        -8
	   x  11111000     x  -8
      ----------------    ------
	      00000000         
	     00000000
	    00000000
       11111000
      11111000
     11111000
    11111000
   11111000
  ----------------
   111000001000000

截断后四位,真值是0, 同理,math.mininteger * math.mininteger的结果也是0

值得一提的是,如果观察后8位,同样能得出64的正确真值,而这个数对16取模依然是0(等效于溢出后的运算结果)

相关推荐
一点媛艺37 分钟前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风42 分钟前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生2 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功2 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨2 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程2 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
GDAL3 小时前
lua入门教程:随机数
lua
Chrikk3 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*3 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue3 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang