型変換とキャストを理解する

変数へ代入できるかを判断するには、値だけでなく式の型を見る必要があります。小さい整数同士を足した結果がintになることや、キャストで値が変わることを、コンパイル結果と表示で確かめます。この課は基本型の数値変換を中心に扱います。

この単元で学ぶこと

  • 拡大変換と縮小変換を区別できる
  • 算術演算での数値昇格と代入可否を判断できる
  • キャスト位置による計算結果の違いを予測できる

本文解説

型には値を表せる範囲がある byteは-128から127、shortは-32768から32767、intは32ビット、longは64ビットの符号付き整数です。charは0から65535を表す符号なし16ビットの値で、文字の表現にも使います。floatとdoubleは浮動小数点数、booleanは真偽値です。booleanを0や1へ数値キャストすることはできません。

拡大変換 int n=10; long total=n;は暗黙の変換で代入できます。byte→short→int→long→float→doubleという方向や、char→int等が拡大変換の例です。ただしint→floatやlong→doubleなどでは桁の精度を失う場合があります。「拡大だから常に全ての値を厳密に保存する」と一般化しません。

縮小変換とキャスト long n=10L; int x=n;は一般にコンパイルできません。int x=(int)n;と変換を明示するのがキャストです。範囲外でも自動で安全確認して例外を出すとは限りません。intからbyteへは下位8ビットを残すため、(byte)130は-126になります。130-256=-126と、byteの範囲へ折り返す結果を確認できます。

小数から整数 (int)3.9は3、(int)-3.9は-3です。この範囲の有限値では0に近い方向へ小数部分を捨てます。四捨五入でも、常に小さい整数へ下げるfloorでもありません。小数が必要なら整数へ変換せず、計算の途中から浮動小数点型を使います。

小さい整数の演算 byte a=2; byte b=3;のときa+bは通常intへ昇格して計算されます。byte c=a+b;はそのままではコンパイルできず、int c=a+b;なら可能です。short同士やchar同士も同様にintが基本となります。片方がlongならlong、floatならfloat、doubleならdoubleという優先で共通の型へ揃える演算もあります。

定数式は別に判断する byte b=100;は100というint定数式がbyteの範囲内なので代入可能です。しかしint n=100; byte b=n;はnが通常の変数なので同じ規則で狭められません。final int n=100; byte b=n;のように定数変数として条件を満たす場合は可能です。値が同じというだけで全て同じコンパイル結果にはなりません。

複合代入との比較 byte b=1; b+=1;は左辺の型へ戻す変換を含むためコンパイルできます。一方b=b+1;は右辺がintなのでそのままでは代入できません。bが127のときb+=1を行うと-128になります。コンパイルできることと、範囲外の値を失わないことは別です。

キャストする位置 int total=7, count=2; double avg=total/count;は、先に整数除算が3となり、その後doubleへ変換され3.0になります。double avg=(double)total/count;なら先にtotalをdoubleへ変えて3.5です。(double)(total/count)では失われた小数を取り戻せません。

実行して確認する 正しいmainの中へSystem.out.println((byte)130);、System.out.println((int)-3.9);、System.out.println((double)7/2);を入れた例では、-126、-3、3.5の三行が出ます。javacで型の不一致がないことを確認し、失敗例は一つずつ別ソースで検査します。Stringから数字を読む解析や、参照型のキャストは数値キャストとは別の規則です。

図解

平均値は変換の位置で変わる
結果の格納先だけでは途中の整数除算を変えられない。

重要ポイント

  • 代入先だけでなく式の型を先に判断する。
  • byte/short/charの算術演算はintへ昇格することが多い。
  • キャストは情報を失う場合がある。
  • 整数除算の後でdoubleへ変えても小数は復元しない。

間違えやすい点

  • 拡大変換は精度を絶対失わないと思わない。
  • 通常変数とコンパイル時定数を同じ扱いにしない。
  • +=と通常の加算代入の変換規則を混同しない。

用語解説

拡大変換
intからlongなど、言語仕様が拡大として定める基本型間の変換。
縮小変換
longからintなど、範囲や精度を失い得る基本型間の変換。
キャスト
丸括弧で変換先の型を明示する記法。
数値昇格
演算のために数値のオペランドを共通の型等へ変換する規則。
定数式
コンパイル時に値を決められる条件を満たした式。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。