2017-10-16 61 views
3

forループで制御ループ変数としてbyteを使用しようとしています。 IはJavaがint型と互換性があるためバイト型の互換性をチェックしなかったのはなぜですか?

for (byte n =0; n < 128 ; n++) System.out.println("I am in For loop. "+ n); 

(128バイトの範囲外である)、N < 128などの条件を使用し、私はしようとしたときにループが0から127まで無限に行き、その後、-128

127でありますintと同じことをする。それはエラーを出した。

for (int n = 0; n < 2147483648; n++) 

int型のリテラル2147483648は、それがintのチェックのように、なぜJavaはバイトと型の互換性をチェックしていなかった範囲外

のですか?

答えて

3

n < 128で比較が行われます。 nはintに伝播されます。しかし、int型のバイト値は128未満です。そして、n ++がオーバーフローします。他のケースでは

n < 2147483648L 

は受け入れられ、同じ問題の原因となったであろう。

7

タイプの互換性は、ループ変数のタイプと照合されません。

接尾辞を持たない整数リテラルの型は、常にintです。 128は有効なintなので、最初のループはコンパイルをパスしますが、数値オーバーフローが発生して無限ループになります。

一方、2147483648は有効なintではないため、2番目のループはコンパイルをパスしません。 2147483648longリテラル(2147483648L)に置き換えると、2番目のループもコンパイルに成功します。

関連する問題