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(等效于溢出后的运算结果)

相关推荐
励志不掉头发的内向程序员14 分钟前
【Linux系列】掌控 Linux 的脉搏:深入理解进程控制
linux·运维·服务器·开发语言·学习
梵得儿SHI21 分钟前
Java 反射机制深度解析:从对象创建到私有成员操作
java·开发语言·class对象·java反射机制·操作类成员·三大典型·反射的核心api
沐知全栈开发24 分钟前
Foundation 折叠列表
开发语言
..Cherry..39 分钟前
【java】jvm
java·开发语言·jvm
冷冷的菜哥1 小时前
go邮件发送——附件与图片显示
开发语言·后端·golang·邮件发送·smtp发送邮件
lly2024061 小时前
Linux 文件与目录管理
开发语言
计算机毕业设计木哥1 小时前
计算机毕业设计选题推荐:基于SpringBoot和Vue的爱心公益网站
java·开发语言·vue.js·spring boot·后端·课程设计
一晌小贪欢1 小时前
Python爬虫第7课:多线程与异步爬虫技术
开发语言·爬虫·python·网络爬虫·python爬虫·python3
ftpeak2 小时前
《Cargo 参考手册》第二十二章:发布命令
开发语言·rust
luckyPian2 小时前
学习go语言
开发语言·学习·golang