有符号整型最大最小值计算问题分析

今天在学习《Lua程序设计(第四版)》时,看到了一道课后习题,觉得很有意思。下面是一些关于题目涉及到的知识点:

  • Lua的数值范围是:math.maxinteger、math.mininteger(5.3版本)
  • 标准Lua使用64bit来表示数值,精简Lua使用32bit存储整型值
  • 在数学领域,回环是结果只能在math.mininteger和math.maxinteger之间。也就是对2的64次方取模
  • maxinteger=2^64-1
  • 整形运算总是会回环的

废话不多说,题目如下:分析下面式子的结果

math.maxinteger * 2 = - 2
math.mininteger * 2 = 0
math.maxinteger * math.maxinteger = 1
math.mininteger * math.mininteger = 0


乍一看有点不太相信,这超乎了常规运算的思维,决定自己上机测试测试,测试代码如下(Lua 5.3版本):

print("maxinteger*2="..math.maxinteger*2)
print("mininteger*2="..math.mininteger*2)
print("maxinteger^2="..math.maxinteger*math.maxinteger)
print("maxinteger^2="..math.mininteger*math.mininteger)

测试结果如下:
在这里插入图片描述
好吧 o( ̄▽ ̄)o 。经典书怎么可能错,各种上网查资料分析,下边做一些记录,这道题本质上是在考察关于数值的溢出处理(即到达了最大可表示的数)。


关于math.maxinteger * 2 = - 2

关键在于二进制如何表示负数: 用最高位表示正负号,“1”表示负号。负数是以补码的形式表示的。详细博客可参考:(o゚v゚)ノ点击

  • 最大值×2相当于,两个最大值相加,即
0111   1111   1111   1111  1111   1111   1111   1111
0111   1111   1111   1111  1111   1111   1111   1111
____________________________________________________
1111   1111   1111   1111  1111   1111   1111   1110

111111111111111111111110实际上是10000000000000000000010(补码),因此1代表负号,后面二进制为2。因此结果为 -2。-2mod(2^64)=-2


关于math.mininteger * 2 = 0

math.mininteger =1000 0000 0000 0000 0000 0000 0000 0000。相加后为:

1000  0000  0000  0000    0000  0000  0000  0000
1000  0000  0000  0000    0000  0000  0000  0000
———————————————————————————————————————————————— 
0000  0000  0000  0000    0000  0000  0000  0000

结果即为0


math.maxinteger * math.maxinteger = 1 与 math.mininteger * math.minintege=0

math.maxinteger*math.maxinteger
=math.maxinteger * (263-1)
=math.maxinteger * 263 - math.maxinteger
=- 263 - 263+1
=-2 * 263 + 1
所以(-2 * 263 + 1)%264 = 1
(哈哈哈哈,瞎胡闹用笔算竟然让我算出来了)
同理,继续算:
math.mininteger * math.minintege
=math.mininteger * 263
=0 mod (264)
=0

ps:为什么math.minintege = 263
我是依据: math.minintege=math.minintege +1推出
事实上,这样的确符合数值的“回环”


  • 最后:终于解决了问题。事实上,我本来对计算机数值的表示不是很熟悉。如果有什么错误,请各位指正。
  • 本问题不仅仅适用于Lua语言,相关的Java等语言也是如此。(我就是从Java的问题中找到的答案)
  • 附上关于Lua的一些数值的常用式子:
    在这里插入图片描述
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值