4

私はプログラミングの初心者です。私はJavaオブジェクトプログラミングの本から勉強していて、本のチュートリアルと例をコンピューターで同時に実行していました。本では、整数の最大値と最小値は次のとおりです。

Integer.MAX_VALUE = 2147483647
Integer.MIN_VALUE = -2147483648

じゃあ良いよ。ここでは問題ありませんが; 最大値に 1 を加え、最小値から 1 を引くと、

class test {
public static void main(String[] args) {

int min = Integer.MIN_VALUE -1;
int max = Integer.MAX_VALUE +1;

int a = min - 1;
int b = max + 1;
System.out.println("min - 1 =" + a);
System.out.println("max - 1 =" + b);
}
}

したがって、次のことがわかります。

min - 1 = 2147483646
max + 1 = -2147483647

この結果は、32ビットで制限されたメモリ内のバイナリプロセスが原因であると言われています。私が理解できなかったもの。コードの一部では、最大値と最小値からそれぞれ 2 を加算および減算していませんか?;

    int min = Integer.MIN_VALUE -1; // subtracted 1 here
int max = Integer.MAX_VALUE +1; // added 1 here

int a = min - 1;  // subtracted 1 here
int b = max + 1; // added 1 here
4

1 に答える 1

7

およびでaあることに注意してください。そうです、実際には、それぞれの場合に 1 を 2 回減算および加算しています。この本は間違っていませんが、ラップアラウンド オーバーフローについて教えるのはばかげています。印刷するだけで、要点がわかりました。Integer.MAX_VALUE - 1bInteger.MIN_VALUE + 1Integer.MIN_VALUE - 1Integer.MAX_VALUE + 1

int min = Integer.MIN_VALUE -1; // min is set to Integer.MAX_VALUE by underflow
int max = Integer.MAX_VALUE +1; // max is set to Integer.MIN_VALUE by overflow

Java 言語仕様、§15.18.2から:

整数の加算がオーバーフローした場合、結果は十分に大きな 2 の補数形式で表される数学的合計の下位ビットになります。

このような質問に関しては JLS が最高の権威ですが、Java を学ぶ方法として JLS を読むことはお勧めしません。Java Language Tutorialを読んだほうがいいでしょう。かなり充実しており、内容の質も高い。

于 2013-06-30T15:46:41.917 に答える