【java解惑】整数オーバーフローのサイクル制御変数


次のコードがあります.
public class Example026 {

	public static final int END = Integer.MAX_VALUE;
	public static final int START = END - 100;

	public static void main(String[] args) {
		int count = 0;
		for (int i = START; i <= END; i++) {
			count++;
			System.out.println(count);
		}
		System.out.println(count);
	}
}

出力の説明:
フルサイズで表示できる範囲内のすべての数字をループ印刷し、プログラムが正しく終了しません.
コード解析:
上記コードにおけるループ制御変数iの開始値はintの最大値から100を減算し、終了条件はintの最大値以下である.ループ運転開始後、iの値がENDに等しい場合、i++の場合、iの値がintの表示範囲を超えてオーバーフローし、iの値が整数の最小値となる.再度iとENDを判定すると、ループ条件が成立し、運転を継続する.ループ条件の値が整数最大値に等しいたびに1オーバーフローが加算され、再実行されます.したがって、上記のプログラムの最終的な結果は、正しく終了できないことです.
上記のコードに対する改善策の1つは、ループ制御条件のタイプをintからlongに変更することである.これにより,iの値が整数最大値に等しいときに1を足すとオーバーフローせず,ループが正常に終了する.
もちろん、コードを書き換えてもよい(100回ではなく101回のループが実行できることを保証する)、以下に示すようにしてもよい.
int count = 0;
int i = START;
do {
   count++;
} while (i != END);

(注:本【java解惑】シリーズは、いずれもブロガーが『java解惑』原書を読んだ後、原書の説明と例の部分を改編し、ブロガーに書いて発表したものである.すべての例は自らテストに合格し、githubに共有されている.これらの例を通じて、自分を励まし、他人に恩恵を与える.同時に、本シリーズのすべてのブロガーはブロガー個人の微信公衆番号(「愛題猿」または「ape_it」を検索する)に同期して発表される.みんなが読むのに便利です.もし文の中に原作者の権利を侵害する内容があれば、直ちにブロガーに知らせて、直ちに削除してください.読者が文の内容に異議や問題がある場合は、ブログの伝言や微信の公衆番号の伝言などを通じて共同で検討することを歓迎します.)
ソースアドレス:https://github.com/rocwinger/java-disabuse
本文は“winger”のブログから出て、転載をお断りします!