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
可以从补码乘法的角度理解,具体参考补码乘法。
方便起见,以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(等效于溢出后的运算结果)