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

2016/04/25

はじめに

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

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

演算子

char型の変換規則

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

Sample25.java

[code]
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型の範囲外のためキャストが必要
}
}
[/code]

実行例

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(変更後)

[code]
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;
}
}
[/code]

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

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

Sample27.java

[code]
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);

}
}
[/code]

-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言語のプログラミングの基礎を教えたりもしています。
最近「キングダム」にはまっています。

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

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