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

相关推荐
白拾10 分钟前
使用Conda管理python环境的指南
开发语言·python·conda
从0至135 分钟前
力扣刷题 | 两数之和
c语言·开发语言
总裁余(余登武)36 分钟前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
NormalConfidence_Man36 分钟前
C++新特性汇总
开发语言·c++
一个闪现必杀技42 分钟前
Python练习2
开发语言·python
有梦想的咕噜1 小时前
target_link_libraries()
开发语言
liu_chunhai1 小时前
设计模式(3)builder
java·开发语言·设计模式
姜学迁1 小时前
Rust-枚举
开发语言·后端·rust
冷白白1 小时前
【C++】C++对象初探及友元
c语言·开发语言·c++·算法
凌云行者1 小时前
rust的迭代器方法——collect
开发语言·rust