Java中的算术运算

时间:2016-04-19 07:04:24

标签: java core

假设我有一个算术函数,它将添加两个long变量并返回long值。如果传递Long.MaxValue()作为参数,它将不会给出完美的结果。那将是什么解决方案?下面的代码解释了我的意思:

public class ArithmaticExample {    
    public static void main(String[] args) {
        System.out.println(ArithmaticExample.addLong(Long.MAX_VALUE, Long.MAX_VALUE));
    }

    public static long addLong(long a,long b){
        return a+b;
    }       
} 

2 个答案:

答案 0 :(得分:1)

所以你可以看到树上的木头,让我们用byte而不是long重新解决问题并考虑

byte a = 0b01111111; // i.e. 127, the largest value of a `byte`.
byte b = 0b01111111;
byte c = (byte)(a + b);

您需要使用显式转换来规避a + bint的转换。

手动计算c会为您提供0b11111110。当然,这是8位2的补码类型中-2的按位表示。

所以byte案例的答案是-2。同样适用于long:在您的添加中只有更多1位可供使用。

请注意,虽然所有这些在Java中都是非常明确的定义,但对于C和C ++来说也是如此。

如果您需要添加两个long这样大小的值,请考虑使用BigInteger

答案 1 :(得分:0)

结果是-2。这不是预期的,因为它似乎比其他任何东西都溢出,但这个结果是"正常"。

Long.MAX_VALUE = 9223372036854775807
Long.MAX_VALUE + 1 = 9223372036854775807
Long.MAX_VALUE + Long.MAX_VALUE = -2