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

相关推荐

  1. lua大数问题

    2024-06-09 14:04:02       11 阅读
  2. C程序训练:大数相乘与阶计算

    2024-06-09 14:04:02       36 阅读
  3. lua 元表

    2024-06-09 14:04:02       23 阅读
  4. 【Redis 开发】分布式锁常见问题Lua脚本

    2024-06-09 14:04:02       11 阅读
  5. RedisLua脚本(一)

    2024-06-09 14:04:02       16 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-09 14:04:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-09 14:04:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-09 14:04:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-09 14:04:02       18 阅读

热门阅读

  1. LeetCode 第401场周赛个人题解

    2024-06-09 14:04:02       12 阅读
  2. 二叉树的统一迭代法-前序中序后序-力扣

    2024-06-09 14:04:02       12 阅读
  3. Qt图表类介绍

    2024-06-09 14:04:02       9 阅读
  4. B3810 [语言月赛 202307] 扶苏和串

    2024-06-09 14:04:02       10 阅读
  5. Rust anyhow 简明教程

    2024-06-09 14:04:02       8 阅读