7

私はちょうどJavaで遊んでいました。この小さなプログラムを書きました:

public class MaxValue{
    public static void main(String[] args){
        int i  =  Integer.MAX_VALUE;
        for(int j = 1; j<=10;j++){
            System.out.println(i*j);
        }
    }
}

出力は次のとおりです。

2147483647

-2

2147483645

-4

2147483643

-6

2147483641

-8

2147483639

-10

今、私は驚いた。この出力を説明する方法がわかりません。整数の最大制限を超える値を処理するために、代わりにlongを使用できることを知っています。しかし、私はJavaがこれをどのように計算するかを知りたいだけですか?

4

3 に答える 3

3

結果のバイナリコンテンツを分析する必要があります。

Integer.MAX_VALUE * 1=0x7fffffffこれは10進数です2147483647

Integer.MAX_VALUE * 2 = 0xfffffffe、つまり-2

Integer.MAX_VALUE * 3 = 0x17ffffffdですが、33ビットであり、切り捨て後は0x7ffffffdであり、2147483645です。

等々...

于 2013-03-25T08:02:45.530 に答える
2

これはオーバーフローと呼ばれます。可能な最大値を超えて操作しているため、数学的な増加操作はオーバーフローする可能性があります。

Javaのオーバーフローに関する詳細情報:http://javapapers.com/core-java/java-overflow-and-underflow/

于 2013-03-25T07:44:47.110 に答える
1

あなたが経験していることはと呼ばれoverflow、プリミティブ型ではjavaはこれを次のように処理します:-到達するIntegers.MAX_VALUEと、に移動し、Integer.MIN_VALUEこの方法で負の値を取得します

于 2013-03-25T07:40:32.820 に答える