AI作成・AIで再検証済(有資格者監修なし)1Z0-815-JPN 対応
プリミティブ型(byte の範囲と定数式の代入変換)難易度 高無料

次のコードのコンパイル結果として正しいものを選べ。

1  public class Q11 {
2      public static void main(String[] args) {
3          byte b1 = 127;
4          byte b2 = 128;
5          System.out.println(b1);
6      }
7  }
  1. Aコンパイルエラー(128 は byte の範囲(-128〜127)を超える)
  2. Bコンパイル成功・実行して 127 と出力される
  3. Cコンパイル成功。b2 は自動的にオーバーフローし -128 になる
  4. Dコンパイルエラー(byte にはリテラルで初期値を代入できない)
正解・解説・誤答理由・ひっかけを見る▼ open
✓ 正解:AAI作成・AIで再検証済

解説

byte の表現範囲は -128 〜 127(符号付き8ビット)。

リテラルの右辺がコンパイル時定数式であり、かつ代入先の型の範囲に収まる場合に限り、明示的なキャスト無しで int リテラルを byte 変数へ代入できる(縮小変換の特例)。

3行目 byte b1 = 127; は範囲の上限ちょうどなので適格。 4行目 byte b2 = 128; は 128 が byte の範囲(最大127)を超えているため、この特例が適用できずコンパイルエラーになる。

各誤答が違う理由
  • B4行目の byte b2 = 128; の時点で 128 が byte の範囲を超えるためコンパイル自体が失敗する。3行目だけを見て通ると判断するのは誤り。
  • C暗黙の変換(キャスト無し)では範囲外の定数はコンパイルエラーになる。オーバーフローが起きるのは明示的にキャスト((byte) 128)した場合のみ。
  • D3行目 byte b1 = 127; のように範囲内のリテラルであれば正常に代入できる。エラーの原因はリテラル代入そのものではなく範囲超過。
ひっかけ: 「リテラルが小さい数値に見えるから何でも byte に入る」という誤解が罠。境界は127までであり、128はすでに範囲外。キャストを付けて byte b2 = (byte) 128; と書けば強制的に代入できるが、その場合はオーバーフローして値が -128 になる(今回のコードにはキャストが無いためコンパイルエラーで止まる)。
コマンド例と想定される挙動(未実行)
javac でコンパイル:
Q11.java:4: error: incompatible types: possible lossy conversion from int to byte
        byte b2 = 128;
                  ^
→ コンパイル不成立(実行に至らない)。
公式ドキュメント・関連JLS SE11 §5.2 Assignment Contexts↗
AIが作成し、別の手順のAIで誤りを点検した解説です(有資格者による監修は経ていません)

この問題集の作り方

  1. 問題と解説はAIが作成しています。この資格の問題に、有資格者(著者)の監修は入っていません。
  2. 各問に、公式ドキュメントの出典リンクを付けています。書いてあることは、出典に当たって確かめられます。
  3. 誤答の選択肢それぞれに、なぜ誤りなのかの理由を書いています。
  4. 誤りを見つけたら報告できます。原則として無償で訂正・削除します。
  5. 各試験の運営団体とは無関係の非公式教材です。合格を保証するものではありません。
この分野をもっと解いて、得点源に
データ型 を含む問題を分野別に演習できます。
演習する →