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

相关推荐
siy23335 分钟前
[c语言日记] 数组的一种死法和两种用法
c语言·开发语言·笔记·学习·链表
njxiejing23 分钟前
Python NumPy安装、导入与入门
开发语言·python·numpy
Rhys..42 分钟前
Python&Flask 使用 DBUtils 创建通用连接池
开发语言·python·mysql
土了个豆子的1 小时前
04.事件中心模块
开发语言·前端·visualstudio·单例模式·c#
@菜菜_达1 小时前
Lodash方法总结
开发语言·前端·javascript
GISer_Jing1 小时前
低代码拖拽实现与bpmn-js详解
开发语言·javascript·低代码
@areok@2 小时前
C++mat传入C#OpencvCSharp的mat
开发语言·c++·opencv·c#
小王C语言2 小时前
【C++进阶】---- map和set的使用
开发语言·c++
Elnaij2 小时前
从C++开始的编程生活(8)——内部类、匿名对象、对象拷贝时的编译器优化和内存管理
开发语言·c++
yb0os13 小时前
RPC实战和核心原理学习(一)----基础
java·开发语言·网络·数据结构·学习·计算机·rpc