HOです。
前回、キーボード入力されたデータをそのまま計算しようとすると、
型の関係でエラーが出てきました。
これから何回かの記事にかけて、
基本データ型(boolean、byte、short、int、long、float、double、char)において、
型を変換できるパターンと、できないパターンをまとめていきたいと思います。
この型変換に関する仕組みは、"Stringの森"のように、結構奥深いものです。
ですので、遭難しない範囲で"型変換の洞窟"を探索してみたいと思います。
まずは、いくつか型変換をテストするプログラムをコンパイルして、
どのようになるか見てみたいと思います。
まずboolean型から他の基本データ型への変換です。
----------------------------------------------------
class TypeTest_Boolean{
public static void main(String args[]){
boolean test = false;
//booleanから各型へ変換
boolean bl = test;
byte bt = test;
short s = test;
int i = test;
long l = test;
float f = test;
double d = test;
char c = test;
}
}
----------------------------------------------------
このプログラムは、boolean型の変数testを宣言し、
それを他の基本データ型に入れるプログラムです。
・・・おもしろいぐらいにコンパイルエラーとなりました!(^_^;)
それでは、エラーの詳細を確認してみましょう。
エラーとなったのは、boolean型以外の基本データ型すべてでした。
エラー内容はすべて「互換性のない型」です。
ここからわかったのは、
boolean型は他の基本データ型に型変換することはできないということです。
それでは、続いてint型から他の基本データ型に変換してみましょう。
----------------------------------------------------
class TypeTest_Int{
public static void main(String args[]){
int test = 1;
//intから各型へ変換
boolean bl = test;
byte bt = test;
short s = test;
int i = test;
long l = test;
float f = test;
double d = test;
char c = test;
}
}
----------------------------------------------------
このプログラムは、
変数testをint型として宣言し、他の基本データ型に入れるものです。
このプログラムもコンパイルしてみましょう。
先ほどのプログラムよりはエラーの数は減りましたね。
1つ目のエラーは、int型からboolean型へは型変換できないというものです。
boolean型と他の基本データ型は型変換できないので、
これは先ほどと同じものですね。
残り3つのエラー内容は、「精度が落ちている可能性」というものです。
「精度が落ちている可能性」というのは、どういう意味でしょうか?
以前基本データ型のデータの範囲を取り上げましたが、(こちら )
int型の範囲は「-2147483648~+2147483647」でした。
それに対し、
byte型は「-128~+127」
short型は「-32768~+32767」
と、int型より範囲が狭くなります。
このように、ある型の値を、それより有効な値の範囲が狭い型に変換する事を、
「縮小交換(ナローイング交換)」と言います。
縮小交換すると、データが失われる可能性があります。
例えば、「int型で宣言した変数」に「40000」という値を入れたとしましょう。
「40000」という値は、byte型の最大値「127」、short型の最大値「32767」より大きい値になります。
それなのに、この「40000」という値をbyte型やshort型入れようとすると、
「40000」という値は失われてしまいます。
もちろん「int型で宣言した変数」に「1」を入れたとすれば、
byte型もshort型も問題なく入れることができます。
しかし、縮小交換をすると、値によってはデータが失われる場合があるため、
Javaのコンパイラは、縮小交換をエラーとして判定します。
それで、「精度が落ちている可能性」というエラー内容が表示されたわけです。
もう一点、char型に関してですが、これも「精度が落ちている可能性」とあります。
char型は1文字を表しますが、
これは、Unicode文字を4桁の16進数で表現しています。
そのため、char型の値を数字として対応することができます。
しかし、byte型、short型と同じく、データが失われる可能性があるため、
「精度が落ちている可能性」というエラー内容が表示されていました。
最後にこのプログラムで取り上げておきたい点が、
エラーとならなかった型変換は何かと言う点です。
int型から、long型・float型・double型への型変換はエラーとなっていません!
どうしてでしょうか?
これらの型の値の範囲を比較すると、その理由が見えてきます。(こちら )
int型の範囲は「-2147483648~+2147483647」なのに対し、
long型が「-9223372036854775808~+9223372036854775807」、
float型が「±3.40282347E+38~±1.40239846E-45」、
double型が「±1.79769313486231570E+308~
±4.94065645841246544E-324」です。
つまりこれらは、int型の値の範囲より、範囲が広い型です。
このようにある型の値を、その型より有効な値の範囲が広い型に変換するのを、
「拡張変換(ワイドニング交換)」と言います。
拡張変換はエラーが出ないということですから、
最後に、様々な拡張変換を試してみましょう。
----------------------------------------------------
class KakutyouTest{
public static void main(String args[]){
//①拡張変換
byte bt = 1;
short s = bt;
char c = s;
int i = c;
float f = i;
long l = f;
double d = l;
//②結果を表示する
System.out.println("byte => " + bt +
"\nshort => " + s +
"\nchar => " + c +
"\nint => " + i +
"\nfloat => " + f +
"\nlong => " + l +
"\ndouble => " + d);
}
}
----------------------------------------------------
2つだけエラーとなりました。
それは、short型からchar型への変換と、
float型からlong型への変換です。
逆に言うと、それ以外の型変換は問題なかったということを意味します。
この2つのエラーの意味については、次回取り上げたいと思います。
今回のポイントです。
「boolean型は他の基本データ型に型変換できない」
サイズの大きな型から小さい型に変換することを
「縮小変換(ナローイング変換)」といい、
サイズの小さな型から大きい型に変換することを
「拡張変換(ワイドニング変換)」という。



