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

这里对两个有符号的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,验证无误。供大家参考,若有出入,请大家指教。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值