<<2.演算子と制御文の目次
byte型の演算
問題10(難易度:3)                              2004年11月10日
 次のbyte型の変数bへの代入について、エラーにならずに代入できるものを選びなさい。
      byte b;
ただし変数aは次のように宣言済みとする。
      int a = 5;

  A. b = 5;
  B. b = 200;
  C. b = 12L;
  D. b = 2.5;
  E. b = 2.5f;
  F. b = (byte)200;
  G. b = a;
解説
 booleanを除いた基本データ型は、お互い値を変換することができます。ただしそれは次の図で示すような方向でなければなりません。これを拡大変換といいます。型名の下にそのサイズをビット数で入れました。拡大とはビット数が大きくなる方向になります。
 例えばshort型の値はint型に、情報の落ちなく変換できるのでOKですが、その逆は32ビットの情報を16ビットに落とすわけですから、コンパイルエラーになります。矢印は一方通行です。

 上のGは、int型のaの値を、byte型に代入しようとしているので、コンパイラを通りません。 
 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−1の範囲しか表せません。これはー128から127なので、200は範囲外です。よって例外の例外でエラーになります。

 最後はF。Bと同じことだから、エラーかな?と思った方、残念でした。これはOkです。明示的にキャスト(型変換)した場合、無理やり変換してくれます。つまり32ビットの200のビットパターンの右側8ビットを取ってきて、変数bに入れてしまうのです。この後bの値を出力してみると、200とはかけ離れた値が出ます。このように( )を使った明示的なキャストは、情報落ちの危険性があるため、注意して使いましょう。使わなければBのようにエラーを出してくれて、おおいけねぇ、と気付くこともあるでしょう。この危険性を重々承知の上キャストするのであればよいでしょう。

 今回はbyte型でやりましたが、charでも、shortでも同じことが言えます。ややこしいので、受験直前に見直しておいてください。


解答 A F

参考 読み物Java 第4章 計算しよう、そうしよう
問題11(難易度:3)                                2004年11月10日
 次をコンパイル、実行すると、結果はどうなりますか。下から選びなさい。
               
          1:    byte x = 1, y, z;
          2:    y = 2;
          3:    z = x + y;
  A. 1行目でコンパイルエラーになる。
  B. 2行目でコンパイルエラーになる。
  C. 3行目でコンパイルエラーになる。
  D. 正常に実行される。
 
解説
 問題10から、2行目はint型の定数をbyte型に代入しているので、エラーにはならないことがわかります。このことは、宣言時の初期値の代入にも適用されるので、1行目も問題なく通ります。

 問題は3行目です。式の中に、char、byte、short型のいずれかがあると、その値はint型に変換されてから、計算が行われます。図ではaとbのbyte型の値1と2がint型に変換されるのが、赤い矢印で示してあります。その上で加算が行われるので、結果はint型の3、これをbyte型の変数に代入しようとするところでエラーになってしまいます。問題10のAのように、=の右側が定数の場合は特別許されたのですが、例外でした。ここでは例外は当てはまらないので、エラーになります。
 


解答 C

参考 読み物Java 第4章 計算しよう、そうしよう 
<<2.演算子と制御文の目次次問題>>
Copyright (c) 2004 Nagi Imai All Rights Reserved..