Javaをはじめよう!第16回~char型の変換規則~

2016/04/25

はじめに

前回は縮小変換(byte,short型)についてご紹介いたしました。

今回はchar型の変換規則について詳しくご紹介いたします。

演算子

char型の変換規則

char型のデータ範囲内の正の値であれば、byte型、short型同様、特別に縮小変換がされます。また、正の値であっても、byte型→char型、short型→char型、char型→short型、char型→byte型に型変換する時は、明示的にキャスト演算を行って型変換する必要があります
実際にソースを見てみましょう。

Sample25.java

package chap02;

class Sample26{
	public static void main(String[] args){
		byte b = 123;	//①範囲内の値のため縮小変換
		short s = 123;	//②範囲内の値のため縮小変換
		char c = 123;	//③範囲内の値のため縮小変換
		c = b;			//④byte型→char型 byte型の負の値がchar型で範囲外のためキャストが必要
		c = s;			//⑤short型→char型 short型の負の値がchar型で範囲外のためキャストが必要
		b = c;			//⑥char型→byte型 char型の正の値がbyte型の範囲外のためキャストが必要
		s = c;			//⑦char型→short型 short型の正の値がchar型の範囲外のためキャストが必要
	}
}

実行例

Exception in thread “main” java.lang.Error: Unresolved compilation problems:
型の不一致: byte から char には変換できません
型の不一致: short から char には変換できません
型の不一致: char から byte には変換できません
型の不一致: char から short には変換できませんat chap02.Sample26.main(Sample26.java:8)

 

では、コンパイルエラーにならないように、sample26.javaのソースをすべてキャスト変換してみましょう。

Sample26.java(変更後)

package chap02;

class Sample26{
	public static void main(String[] args){
		byte b = 123;
		short s = 123;
		char c = 123;
		c = (char)b;
		c = (char)s;
		b = (byte)c;
		s = (short)c;
	}
}

これでコンパイルエラーはなくなります。char型は少し特殊ですが、データの範囲外を指す可能性がある場合は、キャスト演算が必要であることを理解してください。

データ型のデータ範囲を越えた値を、キャスト演算をした場合の特徴について説明します。

Sample27.java

package chap02;

public class Sample27 {
	public static void main(String[] args){
		int i = 128, i2=257;
		byte b= (byte)i;
		byte b2 = (byte)i2;

		System.out.println(b);
		System.out.println(b2);

	}
}
-128
1

いかかでしょうか?意外な結果ではないでしょうか。何故こうなるかは、ビット単位で表示すると分かりやすいです。
int型の128をビット表示すると、00000000 00000000 00000000 00000000 10000000 です。
これをbyte型にキャストすると、先行0(24ビット分)が切り捨てられ、10000000になってしまうのです。
正の値と負の値を表現するために、先頭が1の時は負の値を表現するのでしたね。そのため、-128という値が表示されたのです。

もう一つのint型の257はビット表示すると、00000000 00000000 00000001 00000001 になります。
これをbyte型にキャストすると、byte型は1バイトなので、、上位の3バイトの値は失われます。
byte型の1バイトの部分だけを表示すると00000001 ですから、これはbyte型の表現では、1を表します。このように明示的にキャストを行う場合には、値が、予想もしないものになる可能性がありますので、注意下さい。

さいごに

今回は、char型の変換規則について詳しく紹介いたしました!

次回は算術昇格について詳しく紹介いたします!

投稿者情報

パンダマン

パンダマン

パンダマンです。

主にWebシステム開発等を担当しております。
設計・プログラミング。サーバー管理なんでもやります。

今、担当しているプロジェクトではJavaの今まで触れたことのないフレームワークを使うことになり勉強中です。
学生にC言語のプログラミングの基礎を教えたりもしています。
最近「キングダム」にはまっています。

>> パンダマンが執筆した他の記事を読む

法人向け人気レンタルサーバー
法人向け人気専用サーバー
個人向け人気レンタルサーバー