假设我有一个算术函数,它将添加两个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;
}
}
答案 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 + b
到int
的转换。
手动计算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