Java 为什么0减去整数最小值是个负数,减去整数最小值/2是个正数?

问题1

为什么0减去整数最小值是个负数,减去整数最小值/2是个正数?
在这里插入图片描述

在这里插入图片描述
解答:

Integer.MIN_VALUE: -2147483648
Integer.MAX_VALUE: 2147483647

0减去最小值就变成了214783648,超过了整数的最大值2147483647,所以就溢出了。溢出就相当于一个圆,超过最大值就要变成最小值了。

0减去整数最小值/2是个正数,是因为值没有超过最大值,没有溢出。

问题2:

减号放在外面是个正值,为什么放里面就是负值?
在这里插入图片描述
在这里插入图片描述
减号放在里面改变了运算顺序,本来应该是先计算除法的,但是由于计算机补码的特性(我不懂,但是知道其存在性),先对Interger.MIN_VALUE进行了负值的计算,又由于无声整数溢出:
Integer.MIN_VALUE is -2^31和
Integer.MAX_VALUE is 2^31-1,
因此-IntergerMIN_VALUE等于 2^31, 即Integer.MAX_VALUE + 1,根据定义,它对于整数而言太大。因此它溢出并变成Integer.MIN_VALUE
然后进行了除2的运算,所以最终结果为-1073741824。

以上两种溢出的解释不通,但是意思是一样的,都很好理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值