【问题标题】:Arithmetic Operation in JavaJava中的算术运算
【发布时间】:2016-04-19 07:04:23
【问题描述】:

假设我有一个算术函数,它将添加两个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;
    }       
} 

【问题讨论】:

  • “解决方案是什么” 解决方案是什么? long 有一个范围。如果您将Long.MAX_VALUE 添加到自身,您将超出该范围并环绕。所以? (我可能会在其他地方找工作,除非面试官有比这更好的问题。)
  • 预期结果是什么?好的解决方案是“溢出”(已经发生)、“饱和”、“加宽”(虽然没有更宽的原语,但您需要使用 BigInteger)和“错误输出”。

标签: java core


【解决方案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。当然,这是 -2 在 8 位 2 的补码类型中的按位表示。

所以byte 案例的答案是-2。 long 也是如此:在您的添加中,还有更多 1 位需要处理。

请注意,尽管所有这些在 Java 中都已完美定义,但对于 C 和 C++ 却不能这样说。

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

【讨论】:

    【解决方案2】:

    结果是-2。这不是预期的,因为它似乎比其他任何事情都更溢出,但这个结果是“正常的”。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-27
      • 2016-06-01
      • 2012-12-17
      • 2014-04-30
      • 2014-04-06
      • 2015-08-29
      • 1970-01-01
      相关资源
      最近更新 更多