两个整数相乘的结果一定正确吗?

问题:在我们编写程序时 ,经常需要进行各种计算,例如:将两个int型整数的乘积,赋值给一个 long 型变量,请问这种计算结果一定正确吗?

当为一个 long 型变量赋值一个整数常量时,如果这个整数超过了 int 的取值范围,程序就会出现编译错误,但是有一种情况程序是不会出错的,就是将多个 int 型数据进行算术运算的结果 赋值 给 long 型变量,即使这个运算结果超出了 int 的范围,程序也不会出现编译错误。

说明:一个 Int 在内存中占用 4 个字节的存储空间,其取值范围是 -2147483648 ~ 2147483647 之间的整数,而一个 long 型在内存中占用 8 个字节,取值范围是 -9223372036854775808 ~ 9223372036854775807 之间的整数。

// 出现编译错误
long num1 = 2147483648;

解释:上面的示例 为 long 型变量 num1 赋值 2147483648,由于数值超出了 int 的取值范围,所以程序出现了编译错误,为了能够正确的赋值,需要在 2147483648 后面加 上 小写字母 l 或者是 大写字母 L,这样示例就不会出错了。

// 能够通过编译,结果错误
long num2 = 2147483647 * 10;
System.out.println(num2);// -10

解释:上面示例输出为 -10,并不是我们期待的结果 21474836470,这个是由于参加计算的两个整数都没有超出 int 的取值范围 ,所以编译不会报错;结果错误是由于两个数的乘积时,是以 int 型数据进行计算的,所以计算结果也应该是 int 型,由于结果超出了 int 的取值范围,所以程序发生了 溢出,但是程序会保留这个溢出的结果,所以输出了 -10;

// 既能通过编译,结果又正确
long num4 = 2147483647L * 10;
System.out.println(num4);

解释:上面示例输出为 21474836470,这正是我们期望的结果。这是由于参加计算的两个整数中第一个整数后添加了大写字母 L,这样表示要进行的运算是按长整数进行的,所以程序不会发生溢出,因此可以计算出正确的结果。

你可能感兴趣的:(java)