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

相关推荐
Dovis(誓平步青云)16 分钟前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
做科研的周师兄19 分钟前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
.痞老板.2 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee
奇树谦2 小时前
Qt Quick 图片加载与 GPU 纹理机制详解:QImage、QQuickTextureFactory、QSGTexture 与异步加载
开发语言·qt·系统架构
青梅味猪大肠2 小时前
【操作系统-60】临近适应算法
java·linux·开发语言·嵌入式硬件·算法·操作系统
starzy19903 小时前
深入理解Scala可变Map:动态构建场景下的性能与设计权衡
开发语言·scala
zhanghaha13144 小时前
C# 系列教程_7 判断语句(分支)保姆级精讲
开发语言·c#
apcipot_rain4 小时前
C++转Java日记(02)
java·开发语言·c++
杜 硕5 小时前
从零开始的C++生活——第七讲——02
开发语言·c++·生活
zhanghaha13145 小时前
C# 系列教程_8 循环语句 保姆级精讲(面向新手)
开发语言·c#