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