2016-04-19 32 views
-2

2つの算術関数があり、2つのlong変数を追加し、longという値を返すと仮定します。引数としてLong.MaxValue()を渡すと、完璧な結果は得られません。その解決策は何でしょうか?以下のコードは、私が何を意味するかを説明します。Javaでの算術演算

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

* "何が解決策になるのですか?" *何のための解決策ですか? 'long'には範囲があります。 'Long.MAX_VALUE'を自分自身に追加すると、その範囲を超えてラップアラウンドします。そう? (面接官がそれより良い質問をしていない限り、おそらく他の場所で仕事を探すだろう) –

+0

期待される結果は何ですか?良い解決策は「オーバーフロー」(すでに起こっている)、「飽和」、「広げる」(より広いプリミティブがなくても、BigIntegerに移動する必要があります)と「エラーアウト」です。 – Thilo

答えて

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の値を2つ追加する必要がある場合は、BigIntegerを使用することを検討してください。

0

結果は-2です。これは、何よりもオーバーフローしているように見えるため、期待されるものではありませんが、この結果は「正常」です。

Long.MAX_VALUE = 9223372036854775807 
Long.MAX_VALUE + 1 = 9223372036854775807 
Long.MAX_VALUE + Long.MAX_VALUE = -2 
関連する問題