Javaの複数の2つの数値が負の数で発生する[重複]

Dec 16 2020

私は最近、以下の問題に直面しています

 public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        int i = -2147483648;
        int j = i * -1;
        
        System.out.println("j="+j);
    }
}

結果:-2147483648

コード付きのオンラインIDE: https://paiza.io/projects/e/17lF_6-GltIcyubZv3QoFg?theme=twilight

しかし、2147483648を取得するために必要なロジックに従ってどのように機能するかは正しい結果ですか?では、どうやってこの負の数を取得したのですか?整数範囲(Integer.MIN_VALUE)が原因ですか?この問題を修正する方法は?

回答

1 LiveandLetLive Dec 16 2020 at 03:10

int缶が保持できる最大の正の値は、2147483647それを超えると、値はもう一方の端に移動します(つまり、負の端から開始します)。次のデモから理解できます。

public class Main {
    public static void main(String[] args) {
        int i = -2147483648;
        int j = i * -1;

        System.out.println("j=" + j);

        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MAX_VALUE + 1);
        System.out.println(Integer.MIN_VALUE);

        // Some more examples for you to understand this concept better
        System.out.println(Integer.MAX_VALUE + 2);
        System.out.println(Integer.MAX_VALUE + 3);
    }
}

出力:

j=-2147483648
2147483647
-2147483648
-2147483648
-2147483647
-2147483646

-2147483648に掛け合わされ-1、それはなり2147483648ますがint、変数は、このくらいの大きな正の値を保持することはできません。したがって、それは負の端(すなわちInteger.MIN_VALUE)から始まります。

1 tibetiroka Dec 16 2020 at 03:09

番号2147483648は存在しません。intの最大値は2147483647で、これは予想される結果より1小さい値です。乗算によりオーバーフローが発生し、数値が最小の負の値に「ロールバック」され、そこから計算が続行されます。(言い換えると:2147483647 + 1 = -2147483648(最小の負))結果は最大値を1超えただけなので、追加のアクションは不要で、最小のint値が返されます。

この問題を修正したい場合は、変数に「int」ではなく「long」を使用してください。BigDecimalのようなより複雑なクラスを使用したり、バイト配列のカスタム乗算関数を記述したりすることもできます。

注:使用する数値タイプに関係なく、数値を表すために使用されるメモリが有限である限り、同様の問題が発生する可能性があります。通常の状況では、32ビット整数(int)の場合でも、それは起こりそうにありません。