20

明日テストがあり、本の説明が理解できません。助けてくれてありがとう。

public class TestClass{
      public static void main(String[] args) throws Exception{
            int a = Integer.MIN_VALUE;
            int b = -a;
            System.out.println( a+ "   "+b);
      }
}

出力:-2147483648 -2147483648

なぜこれは、正と負ではなく、同じ大きさの2つの負の数を出力するのですか?

4

4 に答える 4

40

サイレント整数オーバーフローのため: Integer.MIN_VALUEis-2^31Integer.MAX_VALUEis 2^31-1、そう-Integer.MIN_VALUEです is 2^31、 which is Integer.MAX_VALUE + 1、定義により、これは整数には大きすぎます。だから溢れてInteger.MIN_VALUE

次のことも確認できます。

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

同じものを印刷します。

より技術的には、結果はJava 言語仕様 #15.18.2で定義されています。

整数の加算がオーバーフローした場合、結果は十分に大きな 2 の補数形式で表される数学的合計の下位ビットになります。オーバーフローが発生した場合、結果の符号は、2 つのオペランド値の数学的な合計の符号と同じではありません。

于 2012-09-21T17:15:37.980 に答える
5

基本的に、Integer.MAX_VALUEは実際には 2147483647 しかないため-Integer.MIN_VALUE、+2147483648 になる は、実際には整数の内部バイナリ表現の容量をオーバーフローします。したがって、結果はInteger.MIN_VALUE、つまり -2147483648 に「ループ アラウンド」します。

long b = -((long)a);代わりに実行すると、期待どおりの結果が得られます。

于 2012-09-21T17:18:52.687 に答える
1

これをさらに明確に示すには、次のようにします。

Integer.MIN_VALUE is -2^31 = -2147483648
Integer.MAX_VALUE is 2^31-1 = 2147483647 
/*notice this is 1 less than the negative value above*/

Integer.MAX_VALUE取れません2147483648。これは Integer に対して正確に 1 では大きすぎる数値です。これにより、数値がスケール上で最大値から最小値である最初の poing に戻ります。

于 2013-10-10T20:54:25.093 に答える