两个Integer型相加溢出后的赋值情况说明

本文探讨了在Java中对两个最大Integer值相加导致的溢出问题,解释了二进制表示下溢出后的负数原理,并通过代码验证了结果。当Integer超出其表示范围时,其最高位变为1,表示负数,导致实际计算结果为负数。

这里对两个有符号的Integer型数据相加的情况进行说明,对于Unsigned int的情况不适用。

一、情形

public class Main {
    public static void main(String[] args) {
      	//m = n = (2^32 - 1)
        int m = 2147483647;
        int n = 2147483647;
        Long z = (long)(m + n);
        int x = m + n;
        System.out.println(m + n);
        System.out.println(z);
        System.out.println(x);
    }
}

/*
此时的输入情况
-2
-2
-2
*/

二、分析

Integer型的数据表示范围为-2147483648 至 2147483647(2^-31 ~ 2^32 - 1)。Intege型能表示的最大正整数为(2^32 - 1),若m + n 相加后,它们的和大于(2^32 - 1),在二进制的情况下,第32位数字会变成1。这个时候由于我们没有标注Unsigned int,此时第32位上的1表示该数为负数,由于负数在计算机中会以补码的形式存储,则Long z = m + n,此时实际上z存储的是一个负数。举例说明,若m = n = (2^32 - 1)时

 

此时红色框中为m和n的二进制表示,发现第32位数字位0,表示为正数。

当两者相加,此时m + n为

 

此时红色框中为m + n的二进制表示,发现第32位数字位1,由于是有符号数,则被标识为负数,又由于负数在计算机中用二进制的补码标识(这一块涉及到计算机组成原理中关于计算机加法的运算部分),也可以用补码转化器转换为原码,此时红色框作为补码转换为原码后等于-2。

三、验证

用Java程序进行验证,输出结果为-2,验证无误。供大家参考,若有出入,请大家指教。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值