Java入門:第4回 型変換


型変換

 前回、3や3.5などの値そのものをリテラルと呼び、3などの整数値はint型であり、3.5などの浮動小数点値はdouble型であると述べました。Javaでは整数を示す型はbyte, short, int, longと4つの型があり、浮動小数点値を示す型はdoubleとfloatの2つの型があると述べました。

また変数を定義する際は左辺と右辺の型を合わせる必要があると述べました。

するとここで次のような疑問が出てくると思います。

int i = 3;

はOKとして、

byte b = 3;
short s = 3;
long l = 3;

は3がint型であるならば、左辺と右辺の型が異なるため、代入が出来ないのではないか?

実際に確認すると、これらは代入可能です。自動的にbyteリテラルやshortリテラルに変換されます。ただし、例えばbyteは8ビット整数なので最大値が127になります。

byte b = 127;

は大丈夫ですが、

byte b = 128;

はコンパイルエラーになります。

また、

int i = 127;
byte b = i;

はコンパイルエラーになります。あくまで自動解釈されるのはリテラルに対してなので、int型の変数をbyte型の変数に代入する場合は、精度が落ちる可能性があり代入できません。

プログラマーの意思で強制的に代入する場合は、

byte b = (byte)i;

と記述します。この時、(byte)のように、(型)という記述をキャスト(強制型変換)と言います。キャストを行った場合は、次のように思った値にならない場合があるので注意が必要です。

int i = 128;
byte b = (byte)i;
System.out.println(b);

次に浮動小数点値はどのようになるか確認してみましょう?

double d = 3.5;
float f = 3.5;

float f = 3.5;でエラーとなりました。エラーメッセージを確認すると「double型をfloat型に代入できません」と表示されます。
浮動小数点値の場合はdoubleの3.5をfloatに代入する場合は、精度が落ちる可能性があるのでそのままでは代入できません。

float f = (float) 3.5;

のようにキャストを行うか、3.5をfloat型のリテラルとするために、3.5の後にfまたはFを付けます。

float f = 3.5f;
float f = 3.5F

fまたはFでここでは大文字小文字区別しません。同様のものに

long l = 12345678901;

などがあります。この場合、12345678901がint型のリテラルと解釈しようとするのですが、intの最大値を超えるのでエラーとなります。この場合、12345678901がlongのリテラルであることを明示するために、

long l = 12345678901L;

とします。

long l = 12345678901l;

と小文字のエルでも問題ありませんが、I(大文字アイ)、1(イチ)、l(小文字のエル)で間違いやすいのでL(大文字エル)を使うとよいでしょう。

また、資格試験によく出るのですが、

float f = 3.5;

はコンパイルエラーになるのですが、

float f = 1;

はコンパイルエラーにはなりません。1が1.0というfloat型と拡大解釈されて代入することができます。こういった精度が落ちない変換を拡大変換といいます。

一方

int i = 3.5;

は3.5が3になった場合、0.5値を失うことになるので、拡大変換は行われず代入をすることができません。このような場合は、キャストなどを使って強制的に型変換を行います。これらを縮小変換といいます。

まとめ

  • 整数値はint型のリテラルであり、浮動小数点値はdouble型のリテラルである
  • リテラルを基本型に代入する場合、精度が落ちない場合自動変換される(拡大変換)
  • 精度が落ちる場合は、キャストを行い強制的に型変換を行う必要がある(縮小変換)
  • int型のリテラルをlong型のリテラルに変える場合は、lまたはLをつける、double型のリテラルをfloat型のリテラルに変える場合はfまたはFをつける