Cはlong型の定数を代入しています。long型の定数は、最後に「l」(小文字のエル)か「L」(大文字のエル)を付けます。longからbyteへの変換も逆方向になるので、エラーです。
Dは小数点の付いた数値を代入しています。これはdouble型の定数になり、やはり逆方向でエラーです。
Eは最後に「f」が付いているので、float型の定数になります。「F」でもかまいません。これもエラー。
残るAとBとFが問題です。
まずAから。一見int型の定数をbyte型に代入するのだから、だめじゃないか、と思いがちですが、int型の定数に限り、許されるのです。
例外です。気をつけましょう。次の場合が例外に当てはまります。
変数がbyte、short、charのどれか
式の値がint型の定数になる
こんな重箱の隅をつつくような問題出るもんか!いいえ、出るかもしれません。くれぐれも気をつけて。
ではBも大丈夫でしょうか?ここがまた難しいところ、これはコンパイラが通しません。なぜなら200をbyte型に変換しようとしたとき、大きすぎてbyte型に変換できないからです。
byte型は8ビットなので、−2
−7からー2
7−1の範囲しか表せません。これはー128から127なので、200は範囲外です。よって例外の例外でエラーになります。
最後はF。Bと同じことだから、エラーかな?と思った方、残念でした。これはOkです。明示的にキャスト(型変換)した場合、無理やり変換してくれます。つまり32ビットの200のビットパターンの右側8ビットを取ってきて、変数bに入れてしまうのです。この後bの値を出力してみると、200とはかけ離れた値が出ます。このように( )を使った明示的なキャストは、情報落ちの危険性があるため、注意して使いましょう。使わなければBのようにエラーを出してくれて、おおいけねぇ、と気付くこともあるでしょう。この危険性を重々承知の上キャストするのであればよいでしょう。
今回はbyte型でやりましたが、charでも、shortでも同じことが言えます。ややこしいので、受験直前に見直しておいてください。
解答 A F
参考
読み物Java 第4章 計算しよう、そうしよう
解説
問題10から、2行目はint型の定数をbyte型に代入しているので、エラーにはならないことがわかります。このことは、宣言時の初期値の代入にも適用されるので、1行目も問題なく通ります。
問題は3行目です。式の中に、char、byte、short型のいずれかがあると、その値はint型に変換されてから、計算が行われます。図ではaとbのbyte型の値1と2がint型に変換されるのが、赤い矢印で示してあります。その上で加算が行われるので、結果はint型の3、これをbyte型の変数に代入しようとするところでエラーになってしまいます。問題10のAのように、=の右側が定数の場合は特別許されたのですが、例外でした。ここでは例外は当てはまらないので、エラーになります。
解答 C
参考
読み物Java 第4章 計算しよう、そうしよう